在不使用libelf或其他库的情况下创建ELF二进制文件

blu*_*sea 4 c linux compiler-construction elf

最近我试着自己在linux平台上编写一个简单的编译器.

当谈到编译器的后端时,我决定在不使用第三方库的情况下生成ELF格式的二进制文件,例如libelf.

相反,我想通过使用该write()函数并控制ELF文件的所有细节,尝试将机器代码直接写入与ELF ABI 相对应的文件中.

这种方法的优点是我可以控制编译器的所有内容.

但我犹豫了.考虑到ELF ABI的详细程度,这种方式是否可行?

我希望有任何建议和指向现有的可用资源.

R..*_*R.. 5

这有多容易/可行取决于您希望支持哪些功能.如果你想使用动态链接,你必须处理符号表,重定位等.当然,如果你想能够链接现有的库,甚至是静态库,你将不得不支持他们需要的任何东西.但如果你的目标只是制作独立的静态ELF二进制文件,那真的很容易.您只需要一个主ELF头(100%样板)和2个PT_LOAD程序头:一个用于加载程序的代码段,另一个用于加载其数据段.理论上它们可以组合在一起,但是安全加固的内核不允许给定页面既可写又可执行,因此将它们分开是明智之举.

一些建议阅读:

http://www.linuxjournal.com/article/1059