编写 COFF 目标文件...如何引用外部符号
Writing a COFF object file... how to reference external symbols
我要写我的第一个编译器(好吧...大部分工作是使用ANTLR完成的,但仍然需要努力)...我已经做了以下事情:
- 为非常非常简单的计算(+、-、*、/、^ - 当然,具有适当的优先级,这并不难实现)实现了一个工作解释器
- 创建了一个基本的 assembler 代码发射器(这实际上比编写解释器更容易,因为我使用了一种相当简单的基于 "stack" 的方法来处理计算 - 例如:"push var1, push var2, add" - 然后可以轻松地将其转换为简单的 mov / add 指令
- 能够 assemble 到 .exe(使用 ml64)并执行生成的可执行文件
现在我的问题是 - 如果我想自己创建 COFF 目标文件,我如何在库/其他目标文件中引用外部符号?
我的意思是,例如(如果我想调用 printf)它是这样工作的,当我在 ml64 中这样做时:
lea rcx, "address of string"
call printf
但是我到底应该将什么写入 COFF 文件而不是 "printf"?
其他一切都不是那么难实现,但我完全不知道如何引用库/其他目标文件...嗯...
编辑:固定格式(抱歉)+ 说明
代替 printf,你写了四次 0x00
,i。 e.调用本身被组装为 0xe8 0x00 0x00 0x00 0x00
。此外,您需要编写一个类型为 DISP32 的重定位记录,偏移量指向第一个 0x00
,值指向名称为 printf 的符号条目。 Wikipedia 有一些指向详细描述 COFF 格式的文档的链接。
我要写我的第一个编译器(好吧...大部分工作是使用ANTLR完成的,但仍然需要努力)...我已经做了以下事情:
- 为非常非常简单的计算(+、-、*、/、^ - 当然,具有适当的优先级,这并不难实现)实现了一个工作解释器
- 创建了一个基本的 assembler 代码发射器(这实际上比编写解释器更容易,因为我使用了一种相当简单的基于 "stack" 的方法来处理计算 - 例如:"push var1, push var2, add" - 然后可以轻松地将其转换为简单的 mov / add 指令
- 能够 assemble 到 .exe(使用 ml64)并执行生成的可执行文件
现在我的问题是 - 如果我想自己创建 COFF 目标文件,我如何在库/其他目标文件中引用外部符号?
我的意思是,例如(如果我想调用 printf)它是这样工作的,当我在 ml64 中这样做时:
lea rcx, "address of string"
call printf
但是我到底应该将什么写入 COFF 文件而不是 "printf"?
其他一切都不是那么难实现,但我完全不知道如何引用库/其他目标文件...嗯...
编辑:固定格式(抱歉)+ 说明
代替 printf,你写了四次 0x00
,i。 e.调用本身被组装为 0xe8 0x00 0x00 0x00 0x00
。此外,您需要编写一个类型为 DISP32 的重定位记录,偏移量指向第一个 0x00
,值指向名称为 printf 的符号条目。 Wikipedia 有一些指向详细描述 COFF 格式的文档的链接。