我想在我的程序中生成一些机器代码然后运行它。一种方法是写出一个 .so 文件,然后将其加载到程序中,但这似乎太昂贵了。
linux中有没有一种方法可以让我在数据页中写出代码,然后在那里设置我的函数指针并调用它?我在 Windows 上看到过类似的东西,您可以在关闭 NX 保护的情况下分配一个页面,但我找不到针对 Linux 的类似操作系统调用。
The mmap(2) http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html (with munmap(2)
) and 保护(2) http://www.kernel.org/doc/man-pages/online/pages/man2/mprotect.2.html系统调用是执行此操作的基本操作。回想起那个syscalls http://en.wikipedia.org/wiki/System_call从应用程序的角度来看,它们是基本操作。你要PROT_EXEC
你可以只是strace
任何动态链接的可执行文件以获得有关如何调用它们的线索,因为动态链接器ld.so
正在使用它们。
生成共享对象可能比您想象的要便宜。实际上,生成C代码,运行编译器,然后dlopen
即使您交互工作,生成的共享对象也具有一定意义。我的MELT http://gcc-melt.org/领域特定语言(扩展 GCC)正在执行此操作。回想一下,你可以做很多事情dlopen
-s 没有问题。
如果你想在内存中生成机器代码,你可以使用GNU闪电 http://www.gnu.org/software/lightning/(快速生成慢速机器代码),libjit
from dotgnu http://www.gnu.org/software/dotgnu/(生成较少的坏机器代码),LuaJit http://luajit.org/, asmjit http://code.google.com/p/asmjit/(特定于 x86 或 amd64),LLVM http://llvm.org/(慢慢生成优化的机器代码)。顺便说一句,SBCL http://sbcl.org/Common Lisp 实现动态编译到内存并在运行时生成良好的机器代码(并且还有用于 JVM 的所有 JIT 执行此操作)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)