列出未使用的符号

时间:2010-12-15 10:44:00

标签: c++ c linker

我想从一个较大的项目中删除死代码,并希望从未使用的符号开始。反正有没有让链接器列出它已经优化的未使用的符号?我正在使用GNU链接器(LD)和GCC。

如果失败,任何Binutils(readelf或objdump)都可以执行相同的功能吗?

2 个答案:

答案 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,这些标志暗示了死密码警告,以及我发现有用的一系列其他警告。