掏出真正编译到的代码

取出真正编译到的代码

经常一个大型的软件工程,里面包含甚至上GB的文件,然后根据不同的编译选项,实际只会编译到其中的一部分文件。你如何知道那些文件真正的在build过程中别用到了。我之所以改用build这个字眼,没有使用编译,这个词,是因为build过程,不只会包括编译,也时候是脚本处理,也时候是执行一些工具处理一些文件。这整个过程叫build

最典型的例子,一个Linux内核,支持各种体系结构,你如果知道哪些文件你是真正用到的?

你可能会想查看.dep文件。对了大部分,对于纯源代码部分是你找出来了,可以一些编译的脚本,你知道那些真正用到了么?

我们典型的build system是调用make,它分析makefile,之后触发爆炸式的一系列的处理。别管它多复杂,也无非是进程fork & exec新的新的进程。所以只要我们能跟踪make调用起的所有子进程。找到所有的文件就是有希望的。

strace -f -e trace=open,stat,process -o filetrace.log make

工具strace,正好满足这个要求。参数-f是个关键点,用于跟踪所有的子进程。

掏出真正编译到的代码

要提醒一点,strace对系统的消耗是很大的,所以你的make不可以再用多进程编译。具体原因不明,但是我的测试结果是不可以。