【问题标题】:Gold fails to make a relocatable object file from a static libraryGold 无法从静态库中创建可重定位目标文件
【发布时间】:2018-10-19 19:35:29
【问题描述】:

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


我有以下文件:

  • 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.bfd 替换ld,会发生完全相同的事情。然而,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 实现与ldld.bfd 相同的可重定位对象输出?

【问题讨论】:

  • 您应该尝试用 C 对象文件替换 Rust 对象文件。它可能会吐出一些 Gold 还不知道如何处理的元数据。
  • @Shepmaster 请注意,Rust 正在发布一个成熟的静态库。我敢肯定,gold 链接一个简单的 C 目标文件不会有问题——这就是它的设计目的。
  • 我不明白你在哪里定义baz()
  • @Stargateur 我故意没有。它应该在out.o 中未定义。注意我要求链接器产生一个可重定位的输出。这个想法是,稍后,有人可以将out.o确实定义baz的东西联系起来。
  • (请注意,--emit=obj 在任何情况下都不是一个好主意:--crate-type=staticlib 生成的静态库包含共同定义所有额外花里胡哨的目标文件,例如 panic,你需要。)

标签: unix linker rust ld gold-linker


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    错误是什么意思?

    这意味着 Gold 内部断言失败。应该是this one

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

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

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

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

    【讨论】:

    • Done。我仍然不确定这是否真的是一个错误,或者是否是 Rust 静态库在 ldld.bfd 允许的方式存在缺陷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2018-10-10
    相关资源
    最近更新 更多