让我先说我是与链接器相关的事情的菜鸟。如果我说的话似乎没有意义,它可能没有 - 请打电话给我。
我有以下文件:
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
为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
所以:
- 错误是什么意思?
- 如何使用
ld.gold
asld
和实现相同的可重定位对象输出ld.bfd
?