【发布时间】:2010-11-16 15:00:23
【问题描述】:
我正在寻找一种在(非常)大的 C++ 项目中找到静态无法访问的函数的方法。我曾尝试使用这里建议的 doxygen 和其他静态分析工具,但似乎该项目对他们来说太复杂了,无法处理。最后我决定使用 GCC 工具(g++、gprof、gcov 等)是最安全的选择,尽管我不知道该怎么做。
我认为 g++ 优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称。
你有什么建议吗?
【问题讨论】:
我正在寻找一种在(非常)大的 C++ 项目中找到静态无法访问的函数的方法。我曾尝试使用这里建议的 doxygen 和其他静态分析工具,但似乎该项目对他们来说太复杂了,无法处理。最后我决定使用 GCC 工具(g++、gprof、gcov 等)是最安全的选择,尽管我不知道该怎么做。
我认为 g++ 优化消除了静态无法访问的函数,但我不确定如何获取它消除的函数的名称。
你有什么建议吗?
【问题讨论】:
死代码优化通常由链接器完成 - 编译器没有概览。但是,编译器可能已经消除了未使用的 static 函数(因为它们具有内部链接)。
因此,您不应查看 GCC 选项,而应查看 ld 选项。看来你想要--print-gc-sections。但是,请注意,您可能希望 GCC 将每个函数放在其自己的部分 -ffunction-sections 中。默认情况下,GCC 会将所有函数放在同一个部分中,而 ld 不够聪明,无法消除未使用的函数——它只能消除未使用的部分。
【讨论】:
--print-gc-sections 选项打印结果如下:Removing unused section '.text._DriverUnloadHandler' in file '/tmp/ccLoxO8q.ltrans0.ltrans.o'。那么如何找到原来的C文件名呢?
-ffunction-sections 不适用于汇编代码,因为不涉及编译。因此,汇编代码中的所有函数都将位于 .text 部分中,这使得 --print-gc-sections 对于检测未使用的函数的用处不大。
objdump -W /tmp/ccLoxO8q.ltrans0.ltrans.o
.segment .text.MyAssemblyFoo 在您的程序集中手动创建部分。这就是装配的双刃剑:您可以手动完成所有操作,而您必须手动完成所有操作。
gcov 是您正在寻找的。你在问题中列出了,你没有看吗?
【讨论】: