我想从一个较大的项目中删除死代码,并希望从未使用的符号开始。反正有没有让链接器列出它已经优化的未使用的符号?我正在使用GNU链接器(LD)和GCC。
如果失败,任何Binutils(readelf或objdump)都可以执行相同的功能吗?
答案 0 :(得分:6)
大多数编译器/链接器优化未使用的符号。如果您在* nix系统上运行,可以尝试在所有目标文件上使用命令“nm”,对其进行过滤并对其进行排序,以生成由这些目标文件定义的所有导出函数的列表。
nm *.o | grep "^[0-9a-f]* T " | sed 's/^[0-9a-f]* T //' | sort -u > symbols_in.txt
我相信你可以在最后的二进制文件上做同样的事情。
如果你然后区分两组结果,你应该得到一个所有未使用的导出函数的列表。
请注意,某些函数可能会被条件编译排除的代码使用。例如。一个#ifdef开关说在平台A上,使用这样的内置功能,在另一个平台上使用你自己的函数版本,因为没有内置的或标准的库等价,或者它无法正常工作。
答案 1 :(得分:4)
GCC在遇到未使用的函数,标签和函数参数时会生成编译器警告。编译器标志-Wunused -Wunused-parameter
将执行此操作。
我个人建议在开发时打开所有警告和额外警告。标志是-Wall -Wextra
,这些标志暗示了死密码警告,以及我发现有用的一系列其他警告。