Включить двоичный файл с GNU ld linker script
У меня есть рабочий компоновщик script. Я хочу добавить еще один раздел данных, содержимое которого выталкивается непосредственно из файла (ld не должен анализировать его и извлекать разделы и т.д.). Как я могу это сделать?
OUTPUT_FORMAT("elf32-i386")
ENTRY(start)
SECTIONS
{
.text 0x100000 : {
*(.multiboot)
*(.text)
*(.code)
*(.rodata*)
}
.data : {
*(.data)
}
.bss : {
*(.bss)
}
kernel_end = .;
roottask_start = .;
.data : {
HERE I WANT TO INCLUDE THE ENTIRE CONTENTS OF ANOTHER (BINARY) FILE
}
roottask_end = .;
}
Ответы
Ответ 1
Вы можете попробовать использовать objcopy
, чтобы преобразовать его в обычный объект, к которому вы можете подключиться, а затем ссылаться на его символы в компоновщике script, как если бы вы делали обычный объект. На странице objcopy
руководства:
-B bfdarch --binary-архитектура = bfdarch Полезно при преобразовании исходного двоичного входного файла в объект файл. В этом случае выходная архитектура может быть установлена на bfdarch. Эта опция будет проигнорирована, если входной файл имеет известный bfdarch. Вы можете получить доступ к этим двоичным данным внутри программы, указав специальные символы, которые создаются процессом преобразования. Эти символы называются _binary_objfile_start
, _binary_objfile_end
и _binary_objfile_size
. например вы можете преобразовать файл изображения в файл объекта, а затем получить доступ к нему в вашем коде с помощью этих символов.
... где objfile будет расширен до имени входного объектного файла.
См. также параметр --rename-section
.
Ответ 2
Вы можете поместить исходный файл в отдельный раздел в сборке, а затем включить этот раздел в компоновщик script.
Сначала вам нужно создать файл шаблона .S, например.
.section .rawdata
.incbin "blob1.raw"
... и изменить компоновщик script, чтобы включить этот раздел по своему усмотрению:
.data : {
*(.rawdata*)
}
Вы также можете посмотреть здесь здесь для получения более подробной информации о шаблоне .S.
Ответ 3
Другим решением является создание второго компоновщика script, содержащего байты из вашего бинарного файла, используя функцию BYTE
, а затем включить его в прежний компоновщик script с помощью директивы INCLUDE
.
Вы можете сгенерировать script из двоичного файла с помощью hexdump
следующим образом:
cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld
И затем включите его следующим образом:
SECTIONS {
.text : {
/* ... */
kramelfs = .;
INCLUDE "ramelfs.ld" ;
kramelfs_end = .;
/* ... */
}
}