我想识别具有许多库的大型 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
will即使其中的任何代码都没有被使用过,也会被链接进来。要了解原因,请阅读this http://webpages.charter.net/ppluzhnikov/linker.html or this http://eli.thegreenplace.net/2013/07/09/library-order-in-static-linking.
确实如此if你编译代码library2.o
with -ffunction-sections -fdata-sections
and链接到-Wl,-gc-sections
,然后所有代码和数据来自library2.o
将会被 GC 淘汰,但这不是您给出的命令。
想必,您对将库用作库时会发生什么更感兴趣:
gcc main.o -o main.elf -lrary1 -lrary2
在这种情况下,如果没有来自library2
被引用时,链接器不会将其拉入链接。
没有办法向链接器询问它的事物列表didn't使用,但是(如果您使用的是 GNU-ld)有一种方法可以要求它提供对象列表did使用-M
or -Map
选项。一旦知道使用了哪些对象,就可以简单地从链接时使用的所有对象中减去已使用的对象来获取未使用的列表。
Update:
黄金链接器支持--print-symbol-counts FILENAME
选项,这在这里也很有帮助。它打印定义和used符号计数。为了library2.a
,它应该打印$num_defined 0
, the 0
表明没有任何对象来自library2.a
被实际使用了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)