我想在具有许多库的大型 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
将链接进来,即使它的代码从未被使用过。要了解原因,请阅读 this或 this .
确实如果您在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/