列出未使用的符号

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

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

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

nm *.o | grep "^[0-9a-f]* T " | sed 's/^[0-9a-f]* T //' | sort -u > symbols_in.txt 

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

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

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

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

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