让我先说一下,我是一个与链接器相关事物的菜鸟。 如果我说的话看起来没有意义,它可能没有意义 - 请打电话给我。
我有以下文件:
-
bar.rs
#[no_mangle] pub extern fn bar(x: isize) -> isize { x + 1 }
-
foo.c
extern int bar(int); extern int baz(int); int foo(int x) { return bar(x) + baz(x); }
我可以将它们链接到一个可重定位的对象文件中:
$ 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
我不确定引擎盖下发生了什么,但我肯定会得到我想要的输出:bar
和foo
是定义的,而baz
没有。
$ nm out.o | grep '(foo|bar|baz)$'
0000000000000000 T bar
U baz
0000000000000000 T foo
如果我用ld.bfd
替换ld
,也会发生完全相同的事情。然而,事情随着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
这是与 binutils 2.24 和 2.26 一起打包的ld.gold
。
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
,错误仍然存在
所以:
- 错误是什么意思?
- 如何使用
ld.gold
实现与ld
和ld.bfd
相同的可重定位对象输出?
在这里报告。事实证明这已经在主干中修复了,所以我想解决方案是等到 binutils 2.31(或从头开始构建 binutils(。
错误是什么意思?
这意味着黄金未能实现内部断言。大概是这个吧。
如何使用 ld.gold 实现与使用 ld 和 ld.bfd 相同的可重定位对象输出
您需要修复 Gold 来处理此输入,或者更改输入,使其不会触发错误。
由于您和我都不确切了解错误触发条件是什么,因此第一步应该是在 bugzilla 中提交错误。
已经有一个非常相似的错误。不确定您是否遇到了同样的问题。