gcc 链接选项以查看为啥某些目标文件链接到二进制文件

Posted

技术标签:

【中文标题】gcc 链接选项以查看为啥某些目标文件链接到二进制文件【英文标题】:gcc link option to see why some object file is linked into binarygcc 链接选项以查看为什么某些目标文件链接到二进制文件 【发布时间】:2012-10-15 10:47:35 【问题描述】:

我有一些链接问题。

为了调查问题,我添加了 -t 链接器标志 (gcc -Wl,-t) 以打印使用了哪些库以及使用了哪些静态库中的对象。

有一个静态库,在某些配置中使用一组目标文件,而在另一组中使用。

有什么方法(可能是 ld 标志)来查看为什么特定对象(在对象文件中定义了以前未定义的符号)链接到二进制文件中,而其他来自同一个静态库的不是?

【问题讨论】:

【参考方案1】:

我正在寻找的标志是 -M,它会打印到标准输出的链接映射。

来自 ld(1):

  -M
  --print-map
      Print a link map to the standard output.  A link map provides information about the link, including the following:
           ·   Where object files are mapped into memory.
           ·   How common symbols are allocated.
           ·   All archive members included in the link, with a mention of the symbol which caused the archive member to be brought in.
           ·   The values assigned to symbols.

列表中的第二项是我正在寻找的。​​p>

【讨论】:

【参考方案2】:

由于您在上次编辑问题和答案一个多月后添加了赏金,我假设您不喜欢自己的答案。

据我了解,您正试图找出是什么对象 (A) 导致其他对象 (B) 被链接。

如果您在没有 B 存在的情况下进行编译/链接(即在命令行上没有),那么您应该会收到错误消息,告诉您为什么需要它,这将引用 A。

如果 B 在某个库中,您可能需要制作该库的一个不包含 B 的特殊版本。

【讨论】:

其实我喜欢我自己的回答。我确实错误地绑定了,无法取消绑定:)

以上是关于gcc 链接选项以查看为啥某些目标文件链接到二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

每天整理点Linux--gcc常用选项

GCC编译选项

如何获取 GCC 链接器命令?

PWN

精细控制 GCC 的输出

MSYS2 静态链接输出二进制