使GNU ld或GNU gold显示使用档案中的.o文件

我试图链接一个C ++二进制文件,但我得到未定义的符号错误。 我的二进制文件不应该需要这些符号,我想了解导致链接器(GNU ld或GNU gold)的依赖链,认为它们是需要的。 有libfoo.a包含数百个.o文件。 我的程序在libfoo.a调用函数。 我想得到一个依赖关系图,其中包含链接器认为需要链接我的程序的libfoo.a中的所有.o文件。

我需要它,因为我怀疑在libfoo.a某个地方有一个错误,调用了不是真正需要的函数。 我可以修改libfoo.a的源代码(从而删除不需要的调用),为此我需要了解不需要的调用的位置。 依赖图可以帮助我find它。

请注意,由于未定义的符号,没有生成可执行文件。

请注意,我的最终目标不是构build这个特定的二进制文件,而是确保在libfoo.a中不调用不需要的函数。

我已经看过man ld ,但我找不到任何命令行标志,可以给我更详细的输出。

来自链接器的示例错误:

 libfoo++.a(foo1.o):foo1.cc:function foo1f: error: undefined reference to 'bar' 

我怎么知道是什么导致foo1.o被链接到可执行文件? (对于我来说没问题,因为我不需要它,我的问题是foo1.o是必须的,但不应该是,我想删除导致foo1.o的调用被链接。)

我想得到一个依赖关系图,其中包含链接器认为需要链接我的程序的libfoo.a中的所有.o文件。

-M (或--print-map )标志打印的链接器映射完全包含该信息。 如果使用编译器驱动程序(例如gcc )来执行链接(您应该),则将-Wl,-M添加到链接行。