将预编译的应用程序嵌入另一个 C 程序中

Embed a pre-compiled application into another program in C

前言

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


问题

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

启动的供应商程序

由于安装错误和其他问题,有时 popen() 调用会因路径问题、文件被移动等原因而失败。这些都不是我们可以控制的,但尽管如此,客户将其归咎于开发人员。


问题

有没有什么方法,使用一个简单的 plus on 程序,以某种方式将外部应用程序嵌入到我们自己的应用程序中,以便它可以 popen() 在私有内存映射中,这样该程序始终可用于我们的“主”应用程序?

理想情况下,我们只需将此程序的源代码添加到我们自己的代码库中并解决问题,但我们无法做到这一点。

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

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

如果您真的必须将您的应用程序作为一个没有辅助文件的二进制文件发布1,您可以 link 使用 [=27] 将整个二进制文件 link =]呃。 Linux/ELF/ld 的具体细节已充实 in this answer

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


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