让我先说明我是一个与接头相关的菜鸟。如果我说的话似乎没有意义,那可能不会 - 请打电话给我。
我有以下文件:
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
和ld
一样,如何使用ld.bfd
实现相同的可重定位目标输出?答案 0 :(得分:1)
Reported here.事实证明这已经在trunk中修复了,所以我想解决方法是等到binutils 2.31(或者从头开始构建binutils)。
答案 1 :(得分:0)