Написание объектного файла COFF... как ссылаться на внешние символы

Я собираюсь написать свой первый компилятор (хорошо... большая часть работы была сделана с использованием ANTLR, но это все еще требовало усилий)... Я уже сделал следующие вещи:

  • Реализовал работающий интерпретатор для очень, очень простых вычислений (+, -, *, /, ^ - с должным приоритетом, конечно, что было не так сложно реализовать)
  • Создал основной код ассемблера ассемблера (который на самом деле был почти проще, чем написание интерпретатора, потому что я использовал довольно простой подход, основанный на "стеке", для обработки вычислений, например: "push var1, push var2, add"), который затем можно было легко превращается в простые инструкции mov / add
  • Смог собрать в.exe (используя ml64) и выполнить полученный исполняемый файл

Теперь мой вопрос: если я хочу создать объектные файлы COFF самостоятельно, как я могу ссылаться на внешние символы в библиотеках / других объектных файлах?

Я имею в виду, например, (если я хочу вызвать printf) это работает так, когда я делаю это в ml64:

lea rcx, "address of string"
call printf

Но что именно я пишу в файл COFF вместо "printf"?

Все остальное не сложно реализовать, но я абсолютно не знаю, как обращаться к библиотекам / другим объектным файлам... хм...

Редактировать: исправлено форматирование (извините) + уточнения

1 ответ

Решение

Вместо printf пишешь четыре раза 0x00т.е. сам звонок собран как 0xe8 0x00 0x00 0x00 0x00, Кроме того, вам нужно написать запись о перемещении с типом DISP32, со смещением, указывающим на первый 0x00 и значение, указывающее на запись символа с именем printf. В Википедии есть несколько ссылок на документы, подробно описывающие формат COFF.

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