2

我要编写我的第一个编译器(好吧……大部分工作是通过使用 ANTLR 完成的,但仍然需要努力)……我已经做了以下事情:

  • 为非常非常简单的计算实现了一个工作解释器(+、-、*、/、^ - 当然具有适当的优先级,这并不难实现)
  • 创建了一个基本的汇编代码发射器(实际上几乎比编写解释器更容易,因为我使用了一种相当简单的基于“堆栈”的方法来处理计算 - 例如:“push var1,push var2,add” - 这很容易转化为简单的 mov / add 指令
  • 能够组装成 .exe(使用 ml64)并执行生成的可执行文件

现在我的问题是 - 如果我想自己创建 COFF 目标文件,我如何在库/其他目标文件中引用外部符号?

我的意思是,例如(如果我想调用 printf),当我在 ml64 中执行此操作时,它的工作方式如下:

lea rcx, "address of string"
call printf

但是我到底要在 COFF 文件中写入什么而不是“printf”?

其他一切并不难实现,但我完全不知道如何去引用库/其他目标文件......嗯......

编辑:固定格式(对不起)+澄清

4

1 回答 1

3

而不是 printf,你写了四次0x00,即调用本身被组装为0xe8 0x00 0x00 0x00 0x00。此外,您需要编写一个类型为 DISP32 的重定位记录,偏移量指向第0x00一个,值指向一个名为 printf 的符号条目。维基百科有一些详细描述 COFF 格式的文档的链接。

于 2016-03-11T19:30:36.467 回答