最近我试着自己在linux平台上编写一个简单的编译器。
当谈到编译器的后端时,我决定在不使用第三方库的情况下生成ELF格式的二进制文件,例如libelf
。
相反,我想尝试直接将机器代码编写到与ELF ABI相对应的文件中,只需使用write()
函数并控制ELF文件的所有细节。
这种方法的优点是我可以控制编译器的所有内容。
但我犹豫不决。考虑到ELF ABI的详细程度,这种方式是否可行?
我希望有任何建议和指向可用的优质资源。
答案 0 :(得分:5)
这有多容易/可行取决于您希望支持哪些功能。如果你想使用动态链接,你必须处理符号表,重定位等。当然,如果你想能够链接现有的库,甚至是静态库,你将不得不支持他们需要的任何东西。但如果你的目标只是制作独立的静态ELF二进制文件,那真的很容易。您只需要一个主ELF头(100%样板)和2个PT_LOAD
程序头:一个用于加载程序的代码段,另一个用于加载其数据段。理论上它们可以组合在一起,但是安全加固的内核不允许给定的页面既可写又可执行,所以将它们分开是明智的。
有人建议阅读: