Gold 无法从静态库创建可重定位目标文件
Gold fails to make a relocatable object file from a static library
让我先声明一下,我在 link 相关的事情上是个菜鸟。如果我说的话似乎没有意义,那可能没有意义 - 请给我打电话。
我有以下文件:
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); }
我可以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
我不确定幕后发生了什么,但我确实得到了我想要的输出: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
相同的可重定位对象输出?
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)。
让我先声明一下,我在 link 相关的事情上是个菜鸟。如果我说的话似乎没有意义,那可能没有意义 - 请给我打电话。
我有以下文件:
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); }
我可以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
我不确定幕后发生了什么,但我确实得到了我想要的输出: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
相同的可重定位对象输出?
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)。