【问题标题】:Creating ELF binaries without using libelf or other libraries在不使用 libelf 或其他库的情况下创建 ELF 二进制文件
【发布时间】:2012-05-27 14:55:31
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 啊,是的,旧的“我想写我自己的百科全书,因为这样我就不必担心经过同行审查、成千上万人校对过的百科全书有任何不准确之处——我可以做得更好”的论点。
  • @Marc - 对于生产软件,我完全同意。但是,如果您已经在编写自己的编译器来学习编译器编写,为什么不一路走下去,自己进行代码生成和输出。可能是一次非常有趣的学习经历。
  • 这将是链接器的工作,而不是编译器。

标签: c linux compiler-construction elf


【解决方案1】:

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

一些建议阅读:

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

【讨论】:

  • 感谢您的建议。你能推荐一些资料让我学习 ELF 文件格式吗?
  • 添加了一个应该有用的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多