我想在程序中生成一些机器代码,然后运行它.一种方法是写一个.so文件,然后将其加载到程序中,但这似乎太昂贵了.

Linux中,是否有一种方法可以在数据页中写出代码,然后在其中设置函数ointer并进行调用?我在Windows上看到了类似的内容,您可以在该页面上分配一个页面,而该页面的NX保护已关闭,但是我找不到类似的Linux操作系统调用.

解决方法:

mmap(2)(使用munmap(2))和mprotect(2)系统调用是执行此操作的基本操作.回想一下,从应用程序的角度来看,syscalls是基本操作.您想要PROT\_EXEC


您可以跟踪任何动态链接的可执行文件,以获取有关如何调用它们的线索,因为动态链接程序ld.so正在使用它们.

生成共享对象可能比您想象的要便宜.实际上,即使在进行交互工作时,生成C代码,运行编译器,然后dlopen-打开结果共享对象也具有一定意义.我的MELT域特定语言(以扩展GCC)正在执行此操作.回想一下,您可以做很多dlopen -s而不会出现问题.

如果要在内存中生成机器代码,则可以使用GNU lightning(快速生成慢速机器代码),dotgnu中的libjit(生成较少的不良机器代码),LuaJitasmjit(特定于x86或amd64),LLVM(缓慢生成优化的机器)码).顺便说一句,SBCL Common Lisp实现可动态编译到内存中,并在运行时产生良好的机器代码(还有用于JVM的所有JIT).

标签: linux, operating-system

相关文章推荐

添加新评论,含*的栏目为必填