Gold无法从静态库生成可重定位目标文件

时间:2018-05-09 15:55:24

标签: unix linker rust ld gold-linker

让我先说明我是一个与接头相关的菜鸟。如果我说的话似乎没有意义,那可能不会 - 请打电话给我。

我有以下文件:

  • 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

我不确定幕后发生了什么,但我确实得到了我想要的输出:barfoo是定义的,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.goldld一样,如何使用ld.bfd实现相同的可重定位目标输出?

2 个答案:

答案 0 :(得分:1)

Reported here.事实证明这已经在trunk中修复了,所以我想解决方法是等到binutils 2.31(或者从头开始构建binutils)。

答案 1 :(得分:0)

  

错误是什么意思?

这意味着黄金内部断言失败。可能是this one

  

如何使用ld.gold和ld和ld.bfd实现相同的可重定位目标输出

您需要修复Gold以处理此输入,或更改输入以使其不会触发错误。

既然你和我都不明白bug的触发条件是什么,那么第一步应该是在bugzilla中提交bug。

已经有一个非常相似的bug。不确定你是否遇到了同样的问题。