Я создаю свою собственную «игрушечную» операционную систему, и я дошел до того, что я пытаюсь понять связывающие и исполняемые форматы - в частности, у меня есть исполняемый файл двоичного формата плоских файлов, который я загружаю в память в адрес 0x500
, а затем прямо позвонив. В качестве примера рассмотрим следующие две инструкции (я знаю, что они придуманы, я просто хотел включить и call
и mov
в мой образец)
mov ax, some_label
call some_label
; some_label is at address 0x99 into the resulting binary
До сих пор я использовал NASM для получения желаемого результата, используя директиву org 0x500
с командой nasm -f bin myfile.asm
. Получившаяся разборка выглядит так и работает отлично:
mov ax, 0x599
call 0x599
Теперь я хочу начать использовать LD, чтобы связываться с другими объектами, но после долгих экспериментов и чтения я все еще не совсем понимаю, что происходит, чтобы получить надежные результаты.
Я понял, что для получения аналогичного результата мне нужно:
- Получите NASM для вывода в формате obj, который включает в себя информацию о символах, подходящую для связывания (я выбрал ELF, так как формат кажется таким же хорошим, как и любой другой)
- Получите LD, чтобы связать результат с адресом секции
.text
как 0x500
, а затем выдать результат в виде плоского двоичного файла - это компоновщик, который в конечном итоге решает, к чему разрешаются различные смещения в конечном двоичном файле .
Пока что я пробовал следующее:
:: Output as ELF
nasm -f elf myfile.asm
:: Then link and output as binary with the address of .text as 0x500
ld --oformat binary -Ttext 0x500 myfile.o
Однако это дает мне следующую ошибку (это на Mingw):
ld: невозможно выполнить операции PE с выходным файлом без PE
Поиск в Google привел меня к этому списку рассылки , что, кажется, имеет смысл, и поэтому вместо этого я попробовал следующее:
:: Output as ELF
nasm -f elf myfile.asm -o myfile.o
:: Link using LD
ld myfile.o -Ttext 0x500 -s -o myfile.tmp
:: Use objdump to output as a flat binary
objcopy -O binary myfile.tmp myfile
Однако полученный myfile
выглядит как мусор:
00000000 66B8C105E8B8 mov eax,0xb8e805c1
00000006 0000 add [bx+si],al
Я пробовал несколько вариантов вышеупомянутого, но ни один из них не дает того, что я ожидал, и сейчас я совершенно сбит с толку:
- Может кто-нибудь помочь мне понять, что здесь происходит?
- И что мне делать, чтобы дать мне такой же контроль над тем, куда разрешаются адреса в полученном двоичном файле?