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

标签 c linux compiler-construction elf

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

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

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

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

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

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

最佳答案

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

一些建议阅读:

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

关于不使用 libelf 或其他库创建 ELF 二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10679632/

相关文章:

将一些变量的总和转换为指针,然后再次转换为整数

c - "something not a structure or union"

c - 为什么这个 C 代码不打印一个负整数?

linux - 如何使用管道解析命令的输出

design-patterns - 窥孔优化模式

c++ - 如何在头文件中保留一个常量定义,而不是将它链接到每个库中?

c++ - 编译器标志 -l 的位置

c - 使用共享内存以及如何使用 IPC_RMID 正确取消分配空间

linux - 如何开始将 Eclipse 项目存储到本地 svn 存储库? (全新安装的一切)

python - Bluez示例-广告间隔linux