Написание объектного файла 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.