在NX位关闭的情况下在Linux中分配数据页

时间:2012-10-03 15:12:27

标签: linux operating-system

我想在程序中生成一些机器代码,然后运行它。一种方法是写出一个.so文件,然后在程序中加载它,但这看起来太贵了。

在linux中有没有办法让我在我的数据页面中写出代码,然后在那里设置我的函数ointer并调用它?我在Windows上看到了类似的东西,你可以为该页面分配一个关闭NX保护的页面,但我找不到类似的操作系统调用linux。

1 个答案:

答案 0 :(得分:1)

mmap(2)(包含munmap(2))和mprotect(2)系统调用是执行此操作的基本操作。回想一下,从应用程序的角度来看,syscalls是基本操作。你想要PROT_EXEC

您可以strace任何动态链接的可执行文件,以获得有关如何调用它们的线索,因为动态链接器ld.so正在使用它们。

生成共享对象可能比您想象的要便宜。实际上,生成C代码,运行编译器,然后dlopen - 生成的共享对象有一定的意义,即使你以交互方式工作。我的MELT域特定语言(扩展GCC)就是这样做的。回想一下,你可以毫无问题地做很多dlopen - 。

如果要在内存中生成机器代码,可以使用GNU lightning(快速生成慢速机器代码),dotgnu libjit(生成较少的机器代码),{ {3}},LuaJit(特定于x86或amd64),asmjit(缓慢生成优化的机器代码)。顺便说一句,LLVM Common Lisp实现动态编译到内存并在运行时生成良好的机器代码(并且还有JVM的所有JIT都这样做)。