У меня есть рабочий скрипт компоновщика. Я хочу добавить еще один раздел данных, содержимое которого извлекается непосредственно из файла (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 · рейтинг 22 · CesarB
Вы можете попробовать использовать objcopy, чтобы преобразовать его в обычный объект, с которым вы можете связать, а затем ссылаться на его символы в сценарии компоновщика, как если бы вы поступили с обычным объектом. На странице objcopy:
-B bfdarch --binary-architecture = bfdarch Полезно при преобразовании необработанного двоичного входного файла в объектный файл. В этом случае выходная архитектура может быть установлена на bfdarch. Эта опция будет проигнорирована, если входной файл имеет известный bfdarch. Вы можете получить доступ к этим двоичным данным внутри программы, обратившись к специальным символам, созданным в процессе преобразования. Эти символы называются _binary_objfile_start, _binary_objfile_end и _binary_objfile_size. например вы можете преобразовать файл изображения в объектный файл, а затем получить к нему доступ в своем коде, используя эти символы.
... где objfile будет расширен до имени входного объектного файла.
См. Также параметр --rename-section.
Ответ 2 · рейтинг 13 · lmctl
Вы можете поместить необработанный файл в отдельный раздел сборки, а затем включить этот раздел в скрипт компоновщика.
Сначала вам нужно создать файл шаблона .S, например.
.section .rawdata
.incbin "blob1.raw"
... и измените скрипт компоновщика, чтобы включить этот раздел по своему усмотрению:
.data : {
*(.rawdata*)
}
Вы также можете посмотреть здесь здесь для Немного подробнее о шаблоне .S.
Ответ 3 · рейтинг 6 · aimxhaisse
Другое решение - сгенерировать второй сценарий компоновщика, содержащий байты из вашего двоичного файла, с помощью функции BYTE, а затем включить его в предыдущий сценарий компоновщика с помощью директивы INCLUDE.
Вы можете сгенерировать скрипт из вашего двоичного файла с помощью hexdump следующим образом:
cat ramelfs | hexdump -v -e '"BYTE(0x" 1/1 "%02X" ")\n"' > ramelfs.ld
А затем включите это так:
SECTIONS {
.text : {
/* ... */
kramelfs = .;
INCLUDE "ramelfs.ld" ;
kramelfs_end = .;
/* ... */
}
}