移除C语言源代码中未被使用的函数/代码

怎么找到C源程序中没有被引用的function/死代码?
GCC的CFLAGS -Wall -Wextra只能报告未使用的变量,而函数要到代码全部链接完成,才能知道哪些是没有被任何代码引用的,为时已晚。

在编译链接时可以组合使用CFLAGS: -ffunction-sections -fdata-sections 和 LDFLAGS: -Wl,-gc-sections在目标文件里移除未使用的代码,那么如何在源文件里找到这些函数呢?

一个相当简单的办法,编译完成后,对比ELF目标文件和所有obj对象文件中符号表中符号的差异,就这一知道哪些函数在最终的目标文件中被移除了,也就是无用的函数。

首先编译代码:

1
$ cc foo.c -o foo -fdata-sections -ffunction-sections -Wl,--gc-sections -save-temps

注意要使用参数-save-temps保留中间文件,要用到是*.o对象文件
注意要保留符号表,不要strip all
gcc的--gc-sections在clang中对应的是-dead_strip

然后使用这个脚本find-unused-function.sh通过比较符号表找出从未被使用的函数名字

在工程目录下执行

1
$ ./find-unused-function.sh foo .

生成的./DebugSymbol/symbols.unused-binary文件中记载了未被使用的函数名称。

References:
[1]C-code—Find-Unused-functions