代码之家  ›  专栏  ›  技术社区  ›  Alec

Gold无法从静态库创建可重定位的对象文件

  •  4
  • Alec  · 技术社区  · 6 年前

    让我先说一句,我是一个与链接器相关的noob。如果我说的话似乎没有道理,那可能没有道理——请给我打电话。


    我有以下文件:

    • 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
    

    如果我替换 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。金 采用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。金 与…一样 ld公司 ld。bfd公司 ?
    2 回复  |  直到 6 年前
        1
  •  1
  •   Alec    6 年前

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

        2
  •  0
  •   Employed Russian    6 年前

    这个错误意味着什么?

    这意味着黄金的内部主张正在失败。可能 this one

    如何使用ld实现相同的可重定位对象输出。黄金与ld和ld一样。bfd公司

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

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

    已经有一个非常类似的例子 bug .但不确定您是否遇到了相同的问题。