c - 如何将 c 函数注入(inject)或动态加载到另一个 c 程序中

标签 c linux gcc code-injection shared-objects

我想在嵌入式系统上运行的 c 程序中构建一个接口(interface)。这应该接受一些表示 c 函数的字节码。然后这段代码将被加载到内存中并执行。这将类似于远程将代码注入(inject)正在运行的应用程序。这里唯一的区别是我可以实现或更改运行代码并提供接口(interface)。

整个东西应该用于在目标系统上注入(inject)测试代码。

我目前的问题是我不知道如何从现有的 c 函数构建这样的字节码。如果我知道函数的起始地址,映射和执行就没有问题。

目前我正在使用 Ubuntu 进行测试,这让我可以尝试一些在嵌入式系统中不可能实现的技术(根据缺少的操作系统库)。

还有其他解决方案吗?我错过了什么?或者有人可以为我提供另一种解决方案吗? 我希望我没有错过任何东西。

提前致谢

最佳答案

我认为没有简单的解决方案。我知道的最接近的是 GCC's JIT backend (libgccjit) . Here是关于它的博客文章。

作为替代方案,您可以为需要注入(inject)的代码使用脚本语言。例如,ChaiScriptLua .在 this question ,有一个选项摘要。不过,由于您使用的是嵌入式设备,因此开销可能会很大。

如果可以使用基于 LLVM 的后端而不是 GCC,您可以查看 Cling .它是一个基于 LLVM 和 Clang 的 C++ 解释器。根据我个人的经验,它并不总是稳定的,但它在 CERN 的生产中使用。除了动态编译功能在 LLVM 中比在 GCC 中更高级之外,我会异常(exception)。

关于c - 如何将 c 函数注入(inject)或动态加载到另一个 c 程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211287/

相关文章:

C libm.a 编译时不需要链接

linux - open和write中对/dev/null的特殊处理?

c - C中的头文件有什么意义?

c - 以下 strcmp() 代码有什么问题?

c - 尝试从 C 中的字符串中删除子字符串,但始终失败

linux - 如何正确使用libfreenect访问kinect音频设备

改变流程的能力

linux - 如何在 bash 脚本中使用文件描述符 3 中的 "read"进行读取?

linux - 为什么 libc nanosleep 中的寄存器 rax 存在紧密的轮询循环?

具有构造函数属性的 gcc 函数没有被链接