Правильное использование binutils в Linux для написания простого загрузчика - PullRequest
1 голос
/ 05 марта 2012

В настоящее время я пишу простой загрузчик как личный проект.У меня есть рабочий прототип, который был построен с использованием NASM в качестве моего ассемблера.Однако я хотел бы поближе познакомиться с инструментами GNU, и поэтому я пытаюсь переписать свою работу, используя их.

Вот небольшой пример онлайн загрузчика Hello World '1004 *, который демонстрируетиспользование нескольких инструментов для написания и сборки «Bootloader».Тем не менее, после некоторого прочтения, насколько я понимаю, «газ» является бэкэндом для gcc, и что он не должен вызываться напрямую.Я столкнулся с этой информацией, когда пытался написать выражения в моем файле сборки, в котором использовались символы для расчета размера программы, чтобы я знал, сколько 0 байтов мне нужно написать перед записью 0x55 и 0xAA, что может быть достигнуто.используя этот бит кода NASM:

;---------------------------------------------
; Write Zeros up to end of program - 2 then boot signature
;---------------------------------------------
size    equ     $ - entry
        times   (512 - size - 2) db 0
        db      0x55, 0xAA              ;2  byte boot signature

Есть ли способ написать этот эквивалентный набор выражений, используя синтаксис, изначально считанный GAS?Мои попытки не увенчались успехом, например:

.size len, ( 512 - ( (message + 12) - _start) )

При использовании этого выражения и передаче его в as выдается следующая ошибка:

./gasbootloader.asm:24: Error: invalid sections for operation on `message' and `_start'

Нужно ли передавать мою программу черезgcc, чтобы символы могли быть разрешены?

1 Ответ

2 голосов
/ 05 марта 2012

GNU-ассемблер имеет директиву .org, которая делает ненужной математику, которую вам приходилось делать в NASM. Вот пример исходного файла:

entry:
  xor %eax, %eax
  ret

  .org 510
  .byte 0x55, 0xAA

И дамп объектного файла после сборки:

$ clang -c -o example.o example.s
$ otool -t example.o
example.o:
(__TEXT,__text) section
0000000000000000 31 c0 c3 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000000f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000110 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000150 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000170 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
0000000000000190 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00000000000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa 

Как видите, 0x55 0xAA заканчивается там, где вы хотите, без каких-либо особых усилий.

...