【问题标题】:Embed a pre-compiled application into another program in C将预编译的应用程序嵌入到 C 中的另一个程序中
【发布时间】:2017-03-24 03:24:00
【问题描述】:

序言

这可能是xy problem,所以如果有更好的方法来解决这个问题,我愿意接受偏离原始问题的建议。


问题

我有一个相当大的程序,可以生成大量指标、统计数据等。我需要的一项重要计算是能够生成复杂数学运算的输出。唯一可以生成此输出的工具是第三方供应商提供的应用程序。供应商很乐意为我的公司编译适用于任何操作系统/历史/架构的应用程序,但他们无法向我们提供源代码。因此,我们的程序必须依赖于作为同一项目的一部分交付的预编译程序,以及通过popen() 启动的供应商程序。

由于安装故障和其他问题,有时popen() 调用由于路径问题、文件被移动等而失败。这些不是我们可以控制的,但客户却将其归咎于开发人员。


问题

有没有办法,在 程序上使用简单的 加上,以某种方式将外部应用程序嵌入到我们自己的应用程序中,以便它可以popen()'ed 在私有内存映射中,以便我们的“主”应用程序始终可以使用该程序?

理想情况下,我们只需将此程序的源代码添加到我们自己的代码库中即可解决问题,但这对我们来说是不可用的。

【问题讨论】:

  • 他们不能把它编译成一个库而不是一个独立的应用程序?
  • @ChrisDodd 很遗憾,不;他们不能将它作为图书馆运送。
  • 当然他们可以,但选择不将其作为库发布。
  • 可能在运行时解压(如解压缩)另一个程序文件,然后popen它?
  • 您现有的应用程序是否由多个文件组成?在那种情况下,供应商提供的应用程序不只是安装包中的“另一个”文件,tarball,什么?它是如何被移动但其他文件保留在原位的?

标签: c make linux c linux popen libc


【解决方案1】:

如果您确实必须将您的应用程序作为没有辅助文件的单个二进制文件发送1,您可以使用链接器将整个二进制文件链接到您的应用程序中。 Linux/ELF/ld 的具体细节充实了in this answer

然后,在运行时,只需将您的二进制文件写入一个临时文件,然后chmod(2) 以编程方式包含执行权限,最后popen 就像您一直在做的那样。


1 因为如果这不是必需的,供应商提供的应用程序可以被视为必须存在的任何其他辅助文件。我看不出客户如何比您的应用程序目录中的其他文件更混乱的可执行文件。

【讨论】:

    【解决方案2】:

    这确实是一个有趣的问题。我要做的是将可执行文件包含在您的程序中。最简单的方法是创建一个字符数组,它是可执行文件内容的副本。然后在运行时使用mkstemp 创建一个临时文件并将char 数组的内容写入其中。然后,您使用 chmod 添加执行权限并使用 popen 运行,就像您之前所做的那样。

    我发现这个 SO 问题提供了一个代码示例来执行我​​所描述的操作:How to compile and execute from memory directly?

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-03-07
      • 2018-05-03
      • 2014-05-28
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多