Не работает ли GNU linker (ld), когда файлы находятся в разных каталогах? - PullRequest
0 голосов
/ 10 ноября 2018

Когда я запускаю следующую команду,

ld -m elf_i386 -T kernel.ld -o img/kernel bin/entry.o bin/bio.o bin/console.o ... bin/main.o ... bin/proc.o ... bin/vm.o -b binary img/initcode img/entryother

я получаю следующие ошибки:

bin/main.o: In function `startothers':
main.c:75: undefined reference to `_binary_entryother_size'
main.c:75: undefined reference to `_binary_entryother_start'
bin/proc.o: In function `userinit':
proc.c:131: undefined reference to `_binary_initcode_size'
proc.c:131: undefined reference to `_binary_initcode_start'

Однако, если kernel.ld, и все двоичные файлы находятся в одном и том жекаталог, ссылка завершается без ошибок:

ld -m elf_i386 -T kernel.ld -o kernel entry.o bio.o console.o ... main.o ... proc.o ... vm.o -b binary initcode entryother

Является ли компоновщик GNU проблемой, или это красная сельдь?

1 Ответ

0 голосов
/ 11 ноября 2018

Когда создаются символы *_start, *_end и _size, соответствующие двоичным данным, компоновщик создает префикс из аргумента командной строки , поскольку он равен .

То есть компоновщик использует:

  • префикс _binary_initcode_ для аргумента initcode и
  • префикс _binary_img_initcode_ для аргумента img/initcode.

Насколько я знаю, невозможно переопределить этот префикс при вызове компоновщика.


С помощью objcopy можно создать объектный файл с специфическим разделом , содержащий двоичные данные из другого файла:

objcopy -I binary -O <output-format> -B <architecture> --rename-section .data=.initcode,alloc,load,readonly,data,contents img/initcode <output-obj-file>

Полученный объектный файл может быть использован для связи с. В командной строке компоновщика необходимо использовать пользовательский компоновщик srcipt, который определяет размещение двоичного раздела и создает символы, обозначающие его начало и конец:

...
SECTIONS
{
   ...
   <output-section-name>:
   {
       ...
       initcode_start = .;
       *(.initcode);
       initcode_end = .;
       ...
   }
}
...