目标:获取glibc所有.c文件对应的预处理结果文件
方法1:修改makefile
glibc的makefile是非常复杂的,难以实现
方法2:劫持gcc
参考了这篇文章:https://blog.youkuaiyun.com/weixin_39020940/article/details/85522167
具体做法:
写一个可执行文件命名为gcc,将其放在$PATH下保证在执行gcc命令时是执行这个可执行文件,这就是“劫持”
如下是我写的gcc可执行程序,它的逻辑很简单:
- 将gcc的编译选项-c替换为-E
- 将-o指定的输出文件名结尾增加一个.i用来存放预处理结果
#!/bin/bash
para="$@"
gcc="/usr/bin/gcc"
cmd="${gcc} ${para}"
cmd=`echo ${cmd}|awk -F" -c " '{print $1," -E ",$2}'`
front_o=`echo ${cmd}|awk -F" -o " '{print $1}'` #echo将cmd变量中的字符串输出到标准输出流中 通过管道符号将其传递给awk命令进行处理 最后把整体用 ` `括起来为front_o变量赋值
behind_o=`echo ${cmd}|awk -F" -o " '{print $2}'`
o=`echo ${behind_o}|awk '{print$1}'`
cmd="${front_o} -o ${o}.i"
${cmd}
完成以上步骤之后 执行make命令,即可将原本对各个.c文件的编译指令全部替换为生成.c文件对应预处理结果文件的指令
实测方法二无法实现获取全部.c文件的预处理结果的目标,以编译glibc2.27为例会报错: