让我先说一句,我是一个与链接器相关的noob。如果我说的话似乎没有道理,那可能没有道理——请给我打电话。
我有以下文件:
我可以将这些链接到一个可重新定位的对象文件中:
$ 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
具有
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。金
采用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
因此:
-
这个错误意味着什么?
-
如何使用实现相同的可重定位对象输出
ld。金
与…一样
ld公司
和
ld。bfd公司
?