У меня есть скрипт компоновщика, как это:
OUTPUT_FORMAT(binary)
SECTIONS
{
. = 0xFFFF800000000000 ;
.startup_text : { processor.o(.text) }
.text : { *(EXCLUDE_FILE (processor.o) .text) }
.data : { *(.data) }
.rodata : { *(.rodata) }
linker_first_free_page = ALIGN(4096);
}
Кусок кода загружает исполняемый файл, сгенерированный этим сценарием, печатая следующую информацию:
size of executable (pages) 3
first free page 0xffff800000003000
И сам исполняемый файл печатает:
&(linker_first_free_page) 0xffff800000003000
Так что пока все работает хорошо. Теперь мой исполняемый файл нуждается в .bss
раздел. Обратите внимание, что у меня нет загрузчика, способного загружать эльфийские файлы, поэтому мне нужен плоский двоичный файл, который можно просто прочитать и использовать со всеми разделами внутри.
Первая попытка
OUTPUT_FORMAT(binary)
SECTIONS
{
. = 0xFFFF800000000000 ;
.startup_text : { processor.o(.text) }
.text : { *(EXCLUDE_FILE (processor.o) .text) }
.data : { *(.data) }
.rodata : { *(.rodata) }
.bss : { *(.bss) }
linker_first_free_page = ALIGN(4096);
}
То есть просто добавив .bss
раздел. Это вывод:
size of executable (pages) 3
first free page 0xffff800000003000
&(linker_first_free_page) 0xffff800000004000
То есть переменная компоновщика корректно обновляется, но раздел не выделяется (я думаю, это довольно нормально для .bss
раздел).
Вторая попытка
OUTPUT_FORMAT(binary)
SECTIONS
{
. = 0xFFFF800000000000 ;
.startup_text : { processor.o(.text) }
.text : { *(EXCLUDE_FILE (processor.o) .text) }
.data : { *(.data) *(.bss) }
.rodata : { *(.rodata) }
linker_first_free_page = ALIGN(4096);
}
То есть положить .bss
раздел внутри .data
один. Это вывод:
size of executable (pages) 4
first free page 0xffff800000004000
&(linker_first_free_page) 0xffff800000003000
Это .bss
выделена, но переменная компоновщика не обновляется (и я не могу понять, почему …)
Короткий вопрос
Итак, учитывая все вышесказанное, как я могу вставить .bss
раздел в плоском бинарном файле, чтобы его можно было загружать в память как «стандартный» файл и использовать напрямую, без специального загрузчика?
Задача ещё не решена.
Других решений пока нет …