我正在开发应用程序(用C ++编写),该应用程序在运行时会生成一些机器代码(现在是Linux,x86-64,但我计划在ARM上迁移)。接下来,它将生成的代码存储在内存中,并通过跳转到内存位置来执行它。长期以来,我在分配可执行内存方面遇到问题,但最终我使用以下方法解决了问题:
uint8_t *memory = mmap (NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
到目前为止,它是可行的,但是我不确定这是否是执行此类操作的优雅方法。我想知道可执行加载程序是如何做到的?
从本质上讲,这就是可执行加载程序的工作方式。在他们的情况下,他们执行mmap文件的操作,而不是匿名映射,但除此之外,它本质上是相同的。
mmap
请注意,最好不要同时拥有写入和执行访问权限,因为这会使某些类型的安全利用变得更加容易。您可以mprotect在初始映射后使用来调整保护标志。
mprotect