Написание / связывание плоского двоичного файла с использованием NASM + LD

Я создаю свою собственную "игрушечную" ОС, и я дошел до того момента, когда я пытаюсь понимать компоновочные и исполняемые форматы - в частности, у меня есть исполняемый файл в двоичном формате плоского файла, который я загружаю в память по адресу 0x500 , а затем вызываю напрямую. В качестве примера рассмотрим следующие две инструкции (я знаю, что это придумано, Я просто хотел включить в свой пример как вызов , так и 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, чтобы связать результат с адресом .

    • Может ли кто-нибудь помочь мне понять, что здесь происходит?
    • И что я должен делать, чтобы дать мне такой же контроль над тем, где разрешаются адреса в результирующем двоичном файле?
6
задан Justin 12 May 2011 в 15:29
поделиться