我想在嵌入式系统上运行的 c 程序中构建一个接口(interface)。这应该接受一些表示 c 函数的字节码。然后这段代码将被加载到内存中并执行。这将类似于远程将代码注入(inject)正在运行的应用程序。这里唯一的区别是我可以实现或更改运行代码并提供接口(interface)。
整个东西应该用于在目标系统上注入(inject)测试代码。
我目前的问题是我不知道如何从现有的 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)我在这里也找到了一些东西:https://stackoverflow.com/a/12139145/2479996效果很好。但在这里我需要一个额外的链接器脚本,已经用于这样一个简单的程序。
我进一步查看了这篇文章:https://stackoverflow.com/a/9016439/2479996 根据那个答案,我的问题将通过“X11 项目”得到解决。 但我并没有真正找到太多,也许你们中的一些人可以给我一个链接。
还有其他解决方案吗?我错过了什么?或者有人可以为我提供另一种解决方案吗? 我希望我没有错过任何东西。
提前致谢
最佳答案
我认为没有简单的解决方案。我知道的最接近的是 GCC's JIT backend (libgccjit) . Here是关于它的博客文章。
作为替代方案,您可以为需要注入(inject)的代码使用脚本语言。例如,ChaiScript或 Lua .在 this question ,有一个选项摘要。不过,由于您使用的是嵌入式设备,因此开销可能会很大。
如果可以使用基于 LLVM 的后端而不是 GCC,您可以查看 Cling .它是一个基于 LLVM 和 Clang 的 C++ 解释器。根据我个人的经验,它并不总是稳定的,但它在 CERN 的生产中使用。除了动态编译功能在 LLVM 中比在 GCC 中更高级之外,我会异常(exception)。
关于c - 如何将 c 函数注入(inject)或动态加载到另一个 c 程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41211287/