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