4

让我先说我是与链接器相关的事情的菜鸟。如果我说的话似乎没有意义,它可能没有 - 请打电话给我。


我有以下文件:

  • 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

如果我替换ldld.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.goldasld和实现相同的可重定位对象输出ld.bfd
4

2 回答 2

1

在这里报道。原来这已经在主干中修复了,所以我想解决方案是等到 binutils 2.31(或从头开始构建 binutils)。

于 2018-05-11T00:21:18.437 回答
0

错误是什么意思?

这意味着黄金未能通过内部断言。大概就是这个

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

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

由于您和我都不清楚错误触发条件是什么,所以第一步应该是在 bugzilla 中提交错误。

已经有一个非常相似的错误。不知道你是否遇到同样的问题。

于 2018-05-10T01:49:16.653 回答