编写COFF目标文件...如何引用外部符号

时间:2016-03-11 11:29:44

标签: compiler-construction language-agnostic coff

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

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

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

我的意思是,例如(如果我想调用printf)就像这样,当我在ml64中这样做时:

lea rcx, "address of string"
call printf

但究竟我写入COFF文件而不是“printf”?

其他所有内容都难以实现,但我完全不知道如何引用库/其他目标文件......嗯...

编辑:修复格式(抱歉)+澄清

1 个答案:

答案 0 :(得分:2)

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