将预编译的应用程序embedded到C中的另一个程序中

前言

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


问题

我有一个相当大的程序,可以生成很多指标,统计数据等。我需要的一个重要计算是生成复杂math运算输出的能力。 唯一可以生成此输出的工具是第三方供应商提供的应用程序。 供应商很乐意为我的公司编写任何操作系统/ distory /架构的应用程序,但他们不能给我们的来源。 因此,我们的程序必须依靠作为同一项目的一部分被运送的预编译程序,并且通过popen()启动供应商程序。

由于安装错误和其他问题, popen()调用由于path问题,文件被移动等等,有时会失败。这些不是我们可以控制的事情,但是客户把它归咎于开发者。


有没有办法,使用一个简单的C + +在Linux程序,以某种方式embedded外部应用程序到我们自己的应用程序,以便它可以popen()在私人存储器映射编辑,使程序总是可用“主”应用程序?

理想情况下,我们只是将这个程序的源代码添加到我们自己的代码库中,然后解决问题,但这不是我们可用的。

如果您确实必须将您的应用程序作为单个二进制文件发布 ,而不使用辅助文件1 ,则可以使用链接程序将整个二进制文件链接到您的应用程序中。 Linux / ELF / ld的具体细节在这个答案中充实。

然后,在运行时,只需将你的二进制文件写入一个临时文件,然后以编程方式chmod(2)权限来包含execute,最后像你一样进行popen


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

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

我发现这个问题提供了一个代码来完成我所描述的事情: 如何直接从内存中编译和执行?