【问题标题】:Loading into RAM & Executing machine code stored in an object file加载到 RAM 并执行存储在目标文件中的机器代码
【发布时间】:2013-11-07 11:08:42
【问题描述】:

我已经构建了一个 JIT,它读取 c 代码并将它们转换为目标文件 (.o);目标文件存储了一个 ````main(int argc, char **argv)'''' 函数。我的问题是如何将这个对象加载到内存中并执行存储在其中的主函数?

注意:我在 SO 中看到了很多类似的问题,但我找不到答案,所以请不要将此问题标记为重复问题

【问题讨论】:

  • 您的目标文件有什么格式?还是它包含没有附加信息的纯可执行代码?
  • @Armali 与 GCC 的输出 .o 对象格式相同(我用的是 GCC)

标签: linux object arm execute mmap


【解决方案1】:

您可以指示 gcc 生成共享对象 (.so) 文件(这可以从 .c 文件和 .o 文件中实现)- 可能需要选项 -shared-fpic这。然后你可以用void *handle = dlopen(...)加载它,用p = dlsym(handle, "main")获取包含函数的地址,用p()执行它。

【讨论】:

  • 我没有链接器。是否可以在没有链接器的情况下创建.so
  • Hm - 为此,必须至少编写部分链接器。但我想知道......如果你没有链接器,你如何生成应该加载另一个对象并执行它的程序?你不使用图书馆吗?文件操作等函数从何而来,又是如何进入你的程序的?
  • 所有需要的函数和库都由应该运行该对象的可执行文件预先加载到 RAM 中
  • 您没有回答如何生成 that 可执行文件的问题。这些函数和库与您问题的目标文件有何不同?既然您已经能够加载前者,那么加载后者的确切问题是什么?
  • 让我解释得更好;我有一个工作的 GCC 和一个不工作的链接器。所以我决定通过一个程序加载目标文件并在其中运行一个函数。
猜你喜欢
  • 2011-01-27
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多