使用GCC查找无法访问的函数(“死代码”) 我在寻找一个非常(非常)大C++项目中静态不可达函数的方法。我曾尝试过使用doxygen和这里建议的其他静态分析工具,但似乎项目太复杂,他们无法处理。最后,我决定使用GCC工具(g++、gprof、gcov等)是最安全的选择,尽管我不知道如何做到这一点

使用GCC查找无法访问的函数(“死代码”) 我在寻找一个非常(非常)大C++项目中静态不可达函数的方法。我曾尝试过使用doxygen和这里建议的其他静态分析工具,但似乎项目太复杂,他们无法处理。最后,我决定使用GCC工具(g++、gprof、gcov等)是最安全的选择,尽管我不知道如何做到这一点,c++,gcc,dead-code,C++,Gcc,Dead Code,我认为g++优化消除了静态不可访问的函数,但我不确定如何获得它所消除的函数的名称 你有什么建议吗?就是你想要的。您已经在问题中列出了,您没有看过吗?死代码优化通常由链接器完成-编译器没有概述。但是,编译器可能已经删除了未使用的静态函数(因为它们具有内部链接) 因此,您不应该关注GCC选项,而应该关注ld选项。似乎您想要打印gc部分。但是,请注意,您可能希望GCC将每个函数放在自己的节中,-ffunction节。默认情况下,GCC会将所有函数放在同一个节中,而ld不够聪明,无法消除未使用的函数-它

我认为g++优化消除了静态不可访问的函数,但我不确定如何获得它所消除的函数的名称


你有什么建议吗?

就是你想要的。您已经在问题中列出了,您没有看过吗?

死代码优化通常由链接器完成-编译器没有概述。但是,编译器可能已经删除了未使用的
静态
函数(因为它们具有内部链接)


因此,您不应该关注GCC选项,而应该关注ld选项。似乎您想要打印gc部分。但是,请注意,您可能希望GCC将每个函数放在自己的节中,
-ffunction节
。默认情况下,GCC会将所有函数放在同一个节中,而ld不够聪明,无法消除未使用的函数-它只能消除未使用的节

不完全是这样,“gcov创建了一个名为sourcefile.gcov的日志文件,它指示源文件sourcefile.c的每一行执行了多少次。”这是动态分析,而不是静态分析。
--print gc sections
选项打印的结果如下:
删除未使用的section'.text.\u文件'/tmp/ccLoxO8q.ltrans0.ltrans.o'中的DriverUnloadHandler'
。那么如何找到原始的C文件名呢?
-fffunction部分
不适用于汇编代码,因为不涉及编译。因此,汇编代码中的所有函数都将位于
.text
部分,这使得
--print gc部分在检测未使用的函数时变得不那么有用。@smwikipedia:Check
objdump-W/tmp/ccLoxO8q.ltrans0.ltrans.o
@smwikipedia:smwikipedia可以采用无法表示为函数的方式构造。例如,您不能调用C函数的中间部分;C函数只有一个入口点。汇编只是指令的一个序列,您可以跳到该序列中的任意点。在x86中,RHER甚至不是跳转到实际指令边界的限制@smwikipedia:当然,您可以使用
.segment.text.MyAssemblyFoo
在程序集中手动创建节。这就是汇编的双刃剑性质:您可以手动执行所有操作,并且必须手动执行所有签名。