Как я могу внедрить или динамически загрузить функцию c в другую программу c
Я хочу построить интерфейс в программе переменного тока, которая работает на встроенной системе. Это должно принять некоторый байт-код, который представляет функцию переменного тока. Этот код будет загружен в память и выполнен. Тогда это будет что-то вроде удаленного внедрения кода в работающее приложение. Единственная разница здесь в том, что я могу реализовать или изменить работающий код и предоставить интерфейс.
Все это следует использовать для внедрения тестового кода в целевую систему.
Моя текущая проблема заключается в том, что я не знаю, как создать такой байт-код из существующей функции c. Отображение и выполнение это не проблема, если бы я знал начальный адрес функции.
В настоящее время я работаю с Ubuntu в целях тестирования, это позволяет мне попробовать некоторые методы, которые невозможны во встроенной системе (в соответствии с отсутствующими библиотеками операционной системы).
Я строю общий объект и использовал
dlopen()
а такжеdlsym()
запустить эту функцию. Это прекрасно работает, проблема только в том, что у меня нет таких функций во встроенной системе. Я прочитал кое-что о загрузке общего объекта в память и запустил его, но я не смог найти примеры для этого. (см. http://www.nologin.org/Downloads/Papers/remote-library-injection.pdf)Я также взял простой байт-код, который просто выводит hello world на стандартный вывод. Я сохранил этот код в памяти, используя
mmap()
и выполнить его. Это также работало нормально. Здесь проблема в том, что я не знаю, как создать такой байт-код, я просто использовал пример с Hello World из Интернета. (см. https://www.daniweb.com/programming/software-development/threads/353077/store-binary-code-in-memory-then-execute-it)Я также нашел кое-что здесь: /questions/29331228/obektnyij-fajl-v-dvoichnyij-kod/29331240#29331240 который работал очень хорошо. Но здесь мне нужен дополнительный скрипт компоновщика, уже для такой простой программы.
Далее я посмотрел этот пост: /questions/4804933/zagruzkaso-fajlov-iz-pamyati/4804938#4804938 Согласно этому ответу, моя проблема будет решена с помощью "проекта X11". Но я на самом деле не нашел много об этом, может быть, некоторые из вас могут дать мне ссылку.
Есть ли другое решение для этого? Я что-то пропустил? Или кто-то может предложить мне другое решение? Надеюсь я что-то не пропустил.
заранее спасибо
1 ответ
Я не вижу простого решения. Самым близким, что мне известно, является JIT-бэкэнд GCC (libgccjit). Вот сообщение в блоге об этом.
В качестве альтернативы, вы можете использовать язык сценариев для того кода, который необходимо внедрить. Например, ChaiScript или Lua. В этом вопросе есть краткое изложение вариантов. Поскольку вы находитесь на встроенном устройстве, издержки могут быть значительными.
Если возможно использование бэкэнда на основе LLVM вместо GCC, вы можете взглянуть на Cling. Это интерпретатор C++, основанный на LLVM и Clang. По моему личному опыту, он не всегда был стабильным, но он используется в производстве в ЦЕРНе. Я хотел бы, за исключением того, что функции динамической компиляции более продвинуты в LLVM, чем в GCC.