Сценарий компоновщика не пропускает байты, как ожидалось

Итак, у меня есть этот файл сборки, который я собираю с помощью 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 Вы хотите это в своем двоичном файле.

Другие вопросы по тегам