Gold 无法从静态库创建可重定位目标文件

Gold fails to make a relocatable object file from a static library

让我先声明一下,我在 link 相关的事情上是个菜鸟。如果我说的话似乎没有意义,那可能没有意义 - 请给我打电话。


我有以下文件:

我可以link将它们放入一个可重定位目标文件中:

$ rustc --crate-type=staticlib bar.rs -o bar.a
$ gcc -c foo.c -o foo.o
$ ld -r foo.o bar.a -o out.o

我不确定幕后发生了什么,但我确实得到了我想要的输出:barfoo 已定义,而 baz 未定义。

$ nm out.o | grep '\(foo\|bar\|baz\)$'
0000000000000000 T bar
                 U baz
0000000000000000 T foo

如果我将 ld 替换为 ld.bfd,则会发生完全相同的事情。然而,事情因 ld.gold.

而分崩离析
$ ld.gold -r foo.o bar.a -o out.o
ld.gold: internal error in set_info_section, at ../../gold/output.h:3198

这是 ld.gold 与 binutils 2.24 和 2.26 打包在一起的。

问题仍然存在于 binutils 2.30,尽管我得到的行号不同:

$ ld.gold -r foo.o bar.a -o out.o
ld.gold: internal error in set_info_section, at ../../gold/output.h:3386

此外,即使使用 --emit=obj 而不是 --crate-type=staticlib

,错误仍然存​​在

所以:

What does the error mean?

这意味着黄金内部断言失败。大概 this one.

How can I achieve the same relocatable object output with ld.gold as with ld and ld.bfd

您需要修复 Gold 以处理此输入,或者更改输入以使其不会触发错误。

因为你我都不明白错误触发条件是什么,第一步应该是在 bugzilla 中提交错误。

已经有一个非常相似bug。不过不确定您是否遇到了同样的问题。

Reported here. 原来这已经在 trunk 中修复了,所以我想解决方案是等到 binutils 2.31(或从头开始构建 binutils)。