Встроить предварительно скомпилированное приложение в другую программу на C

Преамбула

Потенциально это может быть проблема xy, поэтому я открыт для предложений, которые отклонитесь от первоначального вопроса, если есть лучший способ подойти к этому.


Проблема

У меня есть довольно большая программа, которая генерирует множество метрик, статистики и т. д. Один важный расчет, который мне нужен, — это возможность генерировать выходные данные сложной математической операции. Единственный инструмент, который может генерировать этот вывод, — это стороннее приложение, предоставленное поставщиком. Производитель с удовольствием скомпилирует приложение для моей компании под любую ОС/историю/архитектуру, но не может предоставить нам исходники. В результате наша программа должна полагаться на предварительно скомпилированную программу, поставляемую как часть того же проекта, и на программу поставщика, запускаемую через popen().

Из-за сбоев при установке и других проблем бывают случаи, когда вызов popen() не работает из-за проблем с путями, перемещения файла и т. д. Это не то, что мы можем контролировать, но, тем не менее, клиент винит в этом разработчиков.


Вопрос

Есть ли способ, используя простой c плюс make на странице linux программа, чтобы каким-то образом внедрить внешнее приложение в наше собственное приложение, чтобы его можно было popen() редактировать в приватном отображении памяти, чтобы программа всегда была доступна нашему основному приложению?

В идеале мы просто добавили бы исходный код этой программы в нашу собственную кодовую базу, и проблема была бы решена, но это нам недоступно.


person Cloud    schedule 24.03.2017    source источник
comment
Они не могут скомпилировать его как библиотеку вместо отдельного приложения?   -  person Chris Dodd    schedule 24.03.2017
comment
@ChrisDodd К сожалению, нет; они не могут отправить его как библиотеку.   -  person Cloud    schedule 24.03.2017
comment
Конечно, они могут, но предпочитают не поставлять ее как библиотеку.   -  person chux - Reinstate Monica    schedule 24.03.2017
comment
Может быть, извлечение (например, извлечение из архива) другого файла программы во время выполнения и popen его?   -  person Jokester    schedule 24.03.2017
comment
Технически возможно перенести символы из готового приложения. Но это, вероятно, будет трудным, трудоемким, трудновыполнимым и незаконным.   -  person Jokester    schedule 24.03.2017
comment
Ваше существующее приложение состоит из нескольких файлов? В таком случае, не является ли приложение, поставляемое поставщиком, просто еще одним файлом в установочном пакете, tar-архивом или чем-то еще? Как он перемещается, а остальные файлы остаются на месте?   -  person BeeOnRope    schedule 24.03.2017


Ответы (2)


Если вам действительно необходимо отправить приложение в виде одного двоичного файла без вспомогательных файлов1, вы можете просто связать весь двоичный файл со своим приложением с помощью компоновщика. Конкретные детали для Linux/ELF/ld подробно описаны в этом ответе.

Затем во время выполнения просто запишите свой двоичный файл во временный файл, затем chmod(2) разрешения программно включить выполнение и, наконец, popen как вы это делали.


1 Поскольку, если это не является обязательным требованием, приложение, поставляемое поставщиком, можно просто рассматривать как любой другой вспомогательный файл, который должен присутствовать. Я не понимаю, как клиент может испортить исполняемый файл больше, чем другой файл в каталоге вашего приложения.

person BeeOnRope    schedule 24.03.2017

Это действительно интересный вопрос. Что бы я сделал, так это включить исполняемый файл в вашу программу. Самый простой способ — создать массив символов, который является копией содержимого исполняемого файла. Затем во время выполнения вы используете mkstemp для создания временного файла и записи в него содержимого вашего массива символов. Затем вы добавляете разрешения на выполнение с помощью chmod и запускаете с помощью popen, как и раньше.

Я нашел этот вопрос SO, который представляет собой пример кода, который делает именно то, что я описываю: Как компилировать и выполнять из памяти напрямую?

person Lunar    schedule 24.03.2017