【问题标题】:Writing a COFF object file... how to reference external symbols编写 COFF 目标文件...如何引用外部符号
【发布时间】:2016-03-12 03:30:36
【问题描述】:

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

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

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

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

lea rcx, "address of string"
call printf

但是我究竟应该在 COFF 文件中写入什么而不是“printf”?

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

编辑:固定格式(抱歉)+ 说明

【问题讨论】:

    标签: compiler-construction language-agnostic coff


    【解决方案1】:

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

    【讨论】:

    • 谢谢...我非常想知道为什么为文件格式或 API 文档编写规范的人并不总是提供简单的示例。你的两句话完美地回答了我的问题,应该成为 COFF 规范文件的一部分。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    相关资源
    最近更新 更多