不使用libelf或其他库创建ELF二进制文件

6

最近,我尝试在Linux平台上自己编写一个简单的编译器。

当涉及到编译器的后端时,我决定生成ELF格式的二进制文件,而不使用第三方库,比如libelf

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

这种方法的优点是我可以控制我的编译器的一切。

但我还在犹豫。考虑到ELF ABI的详细程度,这种方式可行吗?

我希望得到任何建议和指向好的可用资源的指针。


7
没错,这是那个老套的论点:“我想写自己的百科全书,这样我就不必担心已经通过同行审核、被成千上万人校对过的那个存在不准确的问题 - 我能做得更好。” - Marc B
3
我完全同意对于生产软件来说,这样做是不可取的。但是如果你已经在编写自己的编译器来学习编译器编写,为什么不一路走到底,自己完成代码生成和输出呢?这可能会是一个非常有趣的学习体验。 - QuantumMechanic
1
这将是链接器的工作,而不是编译器的工作。 - Ignacio Vazquez-Abrams
1个回答

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

一些建议阅读:

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


1
谢谢您的建议。您能推荐一些关于ELF文件格式的学习资料吗? - bluesea
添加了一个链接,应该会有所帮助。 - R.. GitHub STOP HELPING ICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接