列出未使用的符号

dor*_*ron 4 c c++ linker

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

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

Ala*_*irG 6

大多数编译器/链接器优化未使用的符号.如果您在*nix系统上运行,则可以尝试在所有目标文件上使用命令"nm",对其进行过滤并对其进行排序,以生成由这些目标文件定义的所有导出函数的列表.

nm *.o | grep "^[0-9a-f]* T " | sed 's/^[0-9a-f]* T //' | sort -u > symbols_in.txt
Run Code Online (Sandbox Code Playgroud)

我相信你可以在最后的二进制文件上做同样的事情.

如果然后区分两组结果,则应获得所有未使用的导出函数的列表.

请注意,某些函数可能会被条件编译所排除的代码使用.例如#ifdef开关说在平台A上,使用这样的内置功能,并在另一个平台上使用您自己的函数版本,因为没有内置或标准库等效,或者它无法正常工作.


Cad*_*nge 5

GCC 在遇到未使用的函数、标签和函数参数时会生成编译器警告。编译器标志-Wunused -Wunused-parameter将执行此操作。

我个人建议在开发时打开所有警告和额外警告。这些标志-Wall -Wextra和死代码警告由这些标志暗示,以及我发现有用的一大堆其他警告。

  • 这只对不可重定位的符号有帮助。如果符号是可重定位的,我们必须等待链接器决定是否需要该符号,因此编译器将无法提供帮助。 (6认同)