gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:55:33 25 4
gpt4 key购买 nike

让我先声明一下,我是一个与链接器相关的菜鸟。如果我说的话似乎没有意义,那可能没有意义 - 请告诉我。


我有以下文件:

  • 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com