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

标签 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 有这样的选项吗?

最佳答案

For example, if I compile an application with gcc and let's say none of the symbols/functions of library2 are used. Is there any way to get the info about which objects are not linked in?

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

使用上面的命令,library2.o 链接进来,即使它的代码从未被使用过。要了解原因,请阅读 thisthis .

确实如果您在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 0 , 0表示 library2.a 中没有任何对象实际使用。

关于c++ - gcc 链接器获取未使用对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38048977/

相关文章:

c - C中每次将一对数字存储在一个一维数组中

C99:复数的虚部能否为负零

haskell - cabal 错误: invalid preprocessing directive #-}

c++ - Linux 上运行程序的目录?

c++ - C++ 将十进制数转换为二进制数

php - 在哪里可以找到触发 unset() 垃圾回收的 "low memory"和 "free CPU cycles"调用?

c++ - 移动构造对象的 GCC 奇怪行为

C++ 从异步线程更新 Windows 窗口

c++ - Visual C++ Mat 图像元素队列 : how?

c - 在文件作用域中使用C初始化数组大小