【问题标题】:C - External ELF Loading [closed]C - 外部 ELF 加载 [关闭]
【发布时间】:2019-08-29 14:35:34
【问题描述】:

我需要调用我的外部程序。

但是,我只想加载一次;也就是说,

int proc(void *path) { void *p; // ... //ELF loader p = load_magic(path); do { register int t = fork(); if (!t) { // push arguments and jump to entrypoint exec_magic(p, _ARGS_); // execlp(path, _ARGS_); _exit(-0x1); } // stuff } while(CONDITION); // ... }


这可能吗?

【问题讨论】:

  • 您实际上是在寻找应用程序二进制接口 (ABI) 吗?
  • “只加载一次”到底是什么意思?从磁盘读取,进入内存,即使在子进程退出后仍保留在那里,以便可以在下一次迭代中重用?那将是the sticky bit,大多数操作系统不再实现。
  • 是的。我想将 ELF 加载到内存中,以便在迭代中重用它。似乎可以使用 Position Independent Executables : stackoverflow.com/questions/13908276/… ,因此我想知道是否有办法在一般图像上做同样的事情。

标签: c


【解决方案1】:

查看此页面:https://linux.die.net/man/3/execvp - 看起来exec 系列函数可能是满足您需求的解决方案。

【讨论】:

  • 谢谢,但我想加载和重定位 ELF 并将其保存在内存中,然后在循环中调用它。 exec 系列既加载又跳转到 ELF 的入口点。
  • @imakak 我确实认为它将“加载”程序的确切次数牢牢地隐藏在抽象的墙后面。我希望使用页面映射魔术进行后续加载,代码通常是只读的。这要么是 XY,要么是一些特定的优化尝试,(IMO)在问题中描述得有点太差了。
  • @unwind 抱歉,问题描述不好。术语“加载”是指类似 linux 操作系统内核中的 load_elf_binary 之类的东西。
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2011-03-18
  • 2022-07-19
相关资源
最近更新 更多