Gold не может создать перемещаемый объектный файл из статической библиотеки - PullRequest
0 голосов
/ 09 мая 2018

Позвольте мне предварить это, сказав, что я новичок в вещах, связанных с линкерами. Если что-то, что я говорю, кажется бессмысленным, то, вероятно, нет - пожалуйста, позвоните мне.


У меня есть следующие файлы:

  • 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.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, как с ld и ld.bfd?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Сообщается здесь. Оказывается, это уже исправлено в транке, поэтому я думаю, что решение состоит в том, чтобы дождаться binutils 2.31 (или собрать binutils с нуля).

0 голосов
/ 10 мая 2018

Что означает ошибка?

Это означает, что золото не соответствует внутреннему утверждению. Вероятно этот .

Как мне получить такой же вывод перемещаемого объекта с ld.gold, как с ld и ld.bfd

Вам нужно либо исправить Gold для обработки этого ввода, либо изменить ввод, чтобы он не вызывал ошибку.

Поскольку ни вы, ни я не совсем понимаем, каковы условия запуска ошибки, первым шагом должно быть сообщение об ошибке в bugzilla.

Уже есть очень похожая ошибка . Не уверен, что вы столкнулись с той же проблемой.

...