Основная загрузочная запись с использованием сборки GNU

#gnu-assembler #mbr

Вопрос:

Я пытаюсь скомпилировать простой следующий MBR:

 .code16
.globl _start
.text
_start: 
end:
    jmp end
; Don't bother with 0xAA55 yet
 

Я выполняю следующие команды:

 > as --32 -o boot.o boot.s
> ld -m elf_i386 boot.o --oformat=binary -o mbr  -Ttext 0x7c00
 

Однако я получаю двоичный файл размером более 129 МБ, что для меня странно. Таким образом,
Я хотел знать, что происходит в этом процессе сборки ? Большое спасибо.

Запуск objdump поверх загрузки.o дайте мне:

 > objdump -s boot.o
boot.o:     format de fichier elf32-i386

Contenu de la section .text :
 0000 ebfe                                 ..              
Contenu de la section .note.gnu.property :
 0000 04000000 18000000 05000000 474e5500  ............GNU.
 0010 020001c0 04000000 00000000 010001c0  ................
 0020 04000000 01000000 
 

Кажется, что ручное удаление свойства section .note.gnu.перед вызовом ld решает проблему. Однако я не знаю, почему этот раздел отображается по умолчанию… Выполнение следующих команд сборки, по-видимому, также решает проблему:

 > as --32 -o boot.o boot.s -mx86-used-note=no
> ld -m elf_i386 boot.o --oformat=binary -o mbr  -Ttext 0x7c00
 

Комментарии:

1. Что вы видите, если вы objdump файл? Это должно пролить некоторый свет.

2. Не могу воспроизвести в Ubuntu 20.04; мой mbr файл составляет 2 байта.

3. Я нахожусь на ArchLinux, ассемблере GNU (GNU Binutils) 2.36.1 Раздел создается командой «как».