gcc链接器获取未使用对象的列表

时间:2016-06-27 08:19:08

标签: c++ c gcc linker

我想在具有许多库的大型C应用程序中识别未使用的目标文件。随着时间的推移,该项目已经发展很多,现在我想搜索不再使用的库,以便我可以从依赖文件中删除它们。是否可以使用gcc链接器识别未使用的任何对象?

例如,如果我用gcc编译一个应用程序,并且让我们说没有使用library2的符号/函数。有没有办法获取有关哪些对象未链接的信息?

gcc library1.o library2.o main.o -o main.elf

我知道gcc有编译器和链接器标志来删除未使用的符号:

-fdata-sections -ffunction-sections -Wl,--gc-sections

但是这种方式我不知道gcc删除了哪些对象。如果gcc可以选择获取未链接到应用程序的对象列表,那将是完美的。

提到:我需要基于目标文件而不是基于功能/符号!

有没有人知道gcc这样的选项?

2 个答案:

答案 0 :(得分:3)

  

例如,如果我用gcc编译一个应用程序,让我们说没有使用library2的符号/函数。有没有办法获取有关哪些对象未链接的信息?

     

gcc library1.o library2.o main.o -o main.elf

使用上述命令,library2.o 链接,即使其中没​​有使用过任何代码。要了解原因,请阅读thisthis

if 确实在library2.o中使用-ffunction-sections -fdata-sections 链接-Wl,-gc-sections来编译代码,然后全部来自library2.o的代码和数据将被GC输出,但这不是您提供的命令。

据推测,如果您将库用作库,您会更感兴趣:

gcc main.o -o main.elf -lrary1 -lrary2

在这种情况下,如果没有引用library2的代码,链接器就不会将其拉入链接。

没有办法向链接器询问它没有使用的东西的列表,但是(如果你使用的是GNU-ld)有一种方法可以询问它是否有对象列表它 使用:-M-Map选项。一旦你知道使用了什么对象,就可以从链接时使用的所有对象中减去使用过的对象来获取未使用的列表。

<强>更新

Gold链接器支持--print-symbol-counts FILENAME选项,这在这里也很有帮助。它打印已定义和使用的符号计数。对于library2.a,它应打印$num_defined 00表示实际使用的library2.a中没有任何对象。

答案 1 :(得分:1)

查看callcatcher

这会将您的程序编译为程序集,并从程序集输出中提取明显的引用。我猜这正是你要搜索的内容。 (注意,由于它分析汇编程序输出它只能在x86平台上运行)

注意 callcatcher 会忽略虚函数(出于某些原因),因此不会直接允许您分析这些函数。