Позвольте мне предварить это, сказав, что я новичок в вещах, связанных с линкерами. Если что-то, что я говорю, кажется бессмысленным, то, вероятно, нет - пожалуйста, позвоните мне.
У меня есть следующие файлы:
Я могу связать их в один перемещаемый объектный файл с помощью:
$ 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
?