Сценарий компоновщика не пропускает байты, как ожидалось
Итак, у меня есть этот файл сборки, который я собираю с помощью GNU as и связываю с GNU ld, используя скрипт компоновщика.
Скрипт компоновщика (boot.ld
):
INPUT(boot.o)
OUTPUT(boot.out)
ENTRY(boot_start)
SECTIONS {
. = 0x7c00;
.text : { *(.text) }
.data : { *(.data) }
. = 0x7dfe;
.boot_end : { *(.boot_end) }
}
Как вы видите, я пытаюсь сделать файл ровно 512 байт, необходимый для загрузчика, выполнив . = 0x7cdfe
, .boot_end
содержит загрузочную подпись и, таким образом, заполняет оставшиеся два байта.
Я создаю загрузчик следующим образом:
m4 boot.S | as -o boot.o
ld -T boot.ld
objcopy -O binary boot.out boot.img
boot.out
содержит разделы уже с абсолютными адресами и все, кажется, хорошо. .boot_end
я сидела 0x7dfe
и я ожидаю, что отверстия будут заполнены нулями, но нет, boot.img
в общей сложности 55 байтов. Для меня странная вещь заключается в том, что файл даже не содержит загрузочной подписи. Это просто .text
а также .data
без .boot_end
или пропущенные байты.
Как мне переместить ld, чтобы пропустить эти байты? И куда ушла моя загрузочная подпись?
1 ответ
Скорее всего, вам не хватает флага раздела. Дело в том, что если флаги раздела не заданы as
когда вы позже ссылаетесь на ELF для нестандартного (не .text
или же .data
или подобное) имя раздела, раздел не будет выделяться в дампе (т. е. молча игнорируется objcopy
обратите внимание, что это ведет себя по-разному при производстве coff
файлы)
Попробуйте заменить ваш (предположительно) голый
.section boot_end
директива во входном файле вашего ассемблера с
.section boot_end,"a"
(или несколько флагов, например, чтобы сделать его исполняемым, в зависимости от того, что вам нужно) и попробуйте снова.
Флаг "a" делает раздел размещаемым, то есть сообщает обоим ld
а также objcopy
Вы хотите это в своем двоичном файле.