unix - Gold 无法从静态库创建可重定位目标文件

标签 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

这是与 binutils 2.24 和 2.26 一起打包的 ld.gold

问题仍然存在于 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 相同的可重定位对象输出?

最佳答案

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

关于unix - Gold 无法从静态库创建可重定位目标文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50257514/

相关文章:

compiler-errors - 将 BoxStream 转换为 BoxFuture

linux - find -exec 无法识别参数

linux - 如何比较两个目录以更新 BASH 中的日志文件?

linux - 创建生成文件

c++ - 链接器如何处理链接到共享库的 C++ 静态库的唯一类型信息约束?

string - 如何从 Rust 中的文字创建格式化字符串?

linux - 从一个巨大的(有数百万条记录和列)OFS 文件(没有固定标题行)unix 中查找所有唯一列

xcode - 无法为任何cocos2d应用程序甚至是helloworld默认应用程序创建ipa

C++ - undefined symbol 链接器错误 - Xcode

rust - 如何将 &Vector<Mutex> 转换为 Vector<Mutex>