gcc链接器获取未使用对象的列表
gcc linker get list of unused objects
我想在具有许多库的大型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有这样的选择吗?
例如,如果我用gcc编译一个应用程序,假设没有使用library2的任何符号/函数。有什么方法可以获得哪些对象没有链接的信息吗?
gcc library1.o library2.o main.o -o main.elf
使用上面的命令,即使library2.o
中的任何代码都没有使用,它也将链接进来。要了解原因,请阅读此或此。
的确,如果使用-ffunction-sections -fdata-sections
编译library2.o
中的代码,并使用-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 0
,0
表示library2.a
中没有任何对象被实际使用。
看看callcatcher
这会将程序编译为程序集,并从程序集输出中提取明显的引用。我想这正是你在寻找的。(注意,由于它分析汇编程序输出,它只能在x86平台上工作(
注意callcatcher忽略了虚拟函数(出于一些好的原因(,因此它将不允许您直接分析这些函数。
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- Cython正在获取C++对象列表的长度
- 如何在屏幕上显示对象列表?
- Strcmp 类行为应用于C++中的对象列表
- 如何迭代指针指向的对象列表?
- C++对象列表数组
- 使用BOOST :: PYTHON返回裸露的类对象列表,这些对象是不可复制的
- 返回对象列表
- C 链接对象列表
- 使用for_each从对象列表中调用打印功能
- 从对象列表中获取具有特定成员值的所有对象
- 按指针列出的 C++ 对象列表
- 子类对象列表重新解释为基类对象列表?(C++11).
- 在C++中的混合对象列表中使用相同的方法
- Python:我们应该如何编写一个函数来返回对象/列表和布尔标志