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

Linux 使GNU ld或GNU gold显示存档中使用的.o文件 我试图链接一个C++二进制,但是我得到了未定义的符号错误。我的二进制文件不需要这些符号,我想了解导致链接器(gnuld或gnugold)认为需要它们的依赖链。有libfoo.a包含数百个.o文件。我的程序正在libfoo.a中调用函数。我想得到一个包含libfoo.a中所有.o文件的依赖关系图,链接器认为链接我的程序需要这些文件,linux,debugging,linker,Linux,Debugging,Linker,我之所以需要它,是因为我怀疑libfoo.a中的某个地方有错误,调用了实际上并不需要的函数。我可以修改libfoo.a的源代码(从而删除不需要的调用),为此,我需要了解不需要的调用在哪里。依赖关系图可以帮助我找到它 请注意,由于符号未定义,因此没有生成可执行文件 请注意,我的最终目标不是构建这个特定的二进制文件,而是确保不在libfoo.a中调用不需要的函数 我已经查看了manld,但是我找不到任何命令行标志可以提供更详细的输出 链接器中的错误示例: libfoo++.a(foo1.o):foo

我之所以需要它,是因为我怀疑
libfoo.a
中的某个地方有错误,调用了实际上并不需要的函数。我可以修改
libfoo.a
的源代码(从而删除不需要的调用),为此,我需要了解不需要的调用在哪里。依赖关系图可以帮助我找到它

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

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

我已经查看了
manld
,但是我找不到任何命令行标志可以提供更详细的输出

链接器中的错误示例:

libfoo++.a(foo1.o):foo1.cc:function foo1f: error: undefined reference to 'bar'
如何找出是什么导致
foo1.o
链接到可执行文件?(对我来说,
bar
是未定义的,因为我不需要它。我的问题是,
foo1.o
是需要的,但它不应该是,我想删除导致链接
foo1.o
的调用。)

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


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

为什么不制作一个
libfoo.so
共享库?@basilestarynkevich:将动态链接支持添加到我的平台将是一项非常繁重的工作。为什么你认为构建
libfoo.so
可以帮助我找到我想要的东西?你有没有试过根据需要使用--?如果链接器说您有未解析的符号,则可能是正确的:D(编辑:这是RE:您的最终目标,而不是实际问题)@nevelis:
--as-needed
如何帮助我找到有问题的函数调用?是的,链接器是正确的,但是
libfoo.a
中有一个bug,因为它的源代码包含一个不必要的函数调用。我的目标是找到这个函数调用,研究它,然后删除它。我请求帮助找到它。@pts-我的错,那是4am vision的错..:D在您的声明“确保不调用不需要的函数”中,我将“未调用”理解为“未链接”,并试图对此提供帮助。确切地说,此映射打印到stdout,它从包含的
存档成员开始,因为文件(符号)
部分正是我感兴趣的部分。答案被接受。