编写 COFF 对象文件... 如何引用外部符号。

4
我将要写我的第一个编译器(好吧...大部分工作已经通过使用ANTLR完成了,但仍需要努力)...我已经完成了以下工作:
  • 实现了非常简单的计算机解释器(+、-、*、/、^ - 当然具有适当的优先级,这并不难实现)
  • 创建了基本的汇编代码发射器(实际上比编写解释器更容易,因为我使用了一种相当简单的“堆栈”方法来处理计算 - 像:“push var1、push var2、add” - 然后可以很容易地转换成简单的mov / add指令
  • 能够汇编为.exe文件(使用ml64)并执行生成的可执行文件

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

我的意思是,例如(如果我想调用printf),当我在ml64中执行时,它会像这样工作:

lea rcx, "address of string"
call printf

但是我应该在 COFF 文件中写什么,而不是 "printf"?

其他事情实现起来都不是太难,但我真的不知道如何引用库/其他目标文件... 嗯...

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

1个回答

5

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


谢谢您...我真的很想知道为什么编写文件格式或API文档规范的人不总是提供简单的示例。您的两个句子完美地回答了我的问题,应该成为COFF规范文档的一部分。 :-) - frankencode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接