在解释词法分析器和解析器之后,有关如何创建编译器的所有文本都会停止 . 他们没有解释如何创建机器代码 . 我想了解端到端流程 .
目前我的理解是,Windows exe文件格式称为Portable Executable . 我读到了它的 Headers ,我还没有找到一个可以轻松解释这个问题的资源 .
我的下一个问题是,我没有看到任何解释机器代码如何存储在文件中的资源 . 是否像 .text
部分中一个接一个地存储了32位固定长度指令?
有没有地方至少解释如何创建一个什么都不做的exe文件(它有一个No Op指令) . 然后我的下一步是链接到dll文件以打印到控制台 .
6 回答
好问题!我对这个具体问题没有太多专业知识,但这就是我的开始:
PE或ELF不会创建纯机器代码 . 它还包含一些 Headers 信息等 . 阅读更多:Writing custom data to executable files in Windows and Linux
我假设您正在寻找ELF / PE文件如何保存机器代码,您可以从这个问题中获得(使用objdump):How do you extract only contents of an ELF section
现在,如果你想知道如何首先生成内容部分,即如何生成机器代码,那么这就是compiler's code generation的任务 .
尝试使用像ResourceEditor这样的资源编辑器来理解exe或只是ildasm .
PS:这些主要是Unix解决方案,但我确信,PE应该做一些基本相似的事情 .
我认为最好的方法是首先尝试分析现有的PE / ELF如何工作,基本上是逆向工程 . 要做到这一点,Unix机器将是一个很好的起点 . 然后做你的魔术:)
不一样但是类似的问题here .
Update:
我从示例c代码生成了一个对象转储 . 现在,我认为你的目标正确吗?您需要知道生成此文件(a.out)吗?
https://gist.github.com/1329947
看看这张图片,一段c代码的生命周期 .
Source现在,为了清楚起见,您正在寻求实现最后一步,即将目标代码转换为可执行代码?
正如他在他的许多文章中所说的那样,我写道Matt Pietrek's piece about PE internals在写完十多年后仍然是最好的介绍 .
对于Linux,可以阅读并运行Jonathan Bartlett的“从头开始编程”中的示例:
http://www.cs.princeton.edu/courses/archive/spr08/cos217/reading/ProgrammingGroundUp-1-0-lettersize.pdf
当然,人们可能更喜欢破解Windows程序 . 但也许前者提供了一种更好的方式来理解究竟发生了什么 .
毫不奇怪,有关编写PE格式文件的信息的最佳站点都是关于创建病毒的 .
搜索VX Heavens for "PE"提供了大量修改PE文件的教程
我多年来一直使用“Wotsit的文件格式”......一直回到MS-Dos的日子:-)然后回到它只是一个文本文件的集合,你可以从大多数BBS系统下载名为“The游戏程序员文件类型encyclopaedia“
它现在由运行Gamedev.Net的人所拥有,可能是互联网上最好的秘密之一 .
你会在这个页面找到EXE格式:http://www.wotsit.org/list.asp?fc=5
请享用 .
有关使PE文件尽可能小的一些信息:Tiny PE .
如果你只想尝试一些简单的事情,那么乱码代码生成的简约方法是输出MS-DOS .COM files,它没有 Headers 或元数据 . 遗憾的是,您将被限制为16位代码 . 这种格式在demos仍然有点受欢迎 .
至于指令格式,我记得x86指令集是可变长度的,包括1字节指令 . RISC CPU可能具有固定长度的指令 .