Выделение страницы данных в Linux с отключенным битом NX

Я хотел бы сгенерировать некоторый машинный код в моей программе, а затем запустить его. Один из способов сделать это - записать файл .so, а затем загрузить его в программу, но это кажется слишком дорогостоящим.

Есть ли способ в linux для того, чтобы я мог выписать код на своих страницах данных, а затем установить там свою функцию и просто назвать ее? Я видел что-то подобное в окнах, где вы можете выделить страницу с отключенной защитой NX для этой страницы, но я не могу найти аналогичный вызов ОС для Linux.

Ответ 1

mmap (2)munmap(2)) и mprotect (2) syscalls - это элементарные операции для этого. Напомним, что syscalls - это элементарные операции с точки зрения приложения. Вы хотите PROT_EXEC

Вы можете просто strace любой динамически связанный исполняемый файл, чтобы получить представление о том, как вы могли бы их назвать, поскольку динамический компоновщик ld.so использует их.

Создание общего объекта может быть менее дорогостоящим, чем вы себе представляете. На самом деле, генерирование кода C, запуск компилятора, а затем dlopen -в результате получившегося общего объекта имеет смысл, даже когда вы работаете в интерактивном режиме. Мой MELT доменный язык (для расширения GCC) делает это. Напомним, что вы можете делать большую часть dlopen -s без проблем.

Если вы хотите сгенерировать машинный код в памяти, вы можете использовать молнию GNU (быстрая генерация медленного машинного кода), libjit от dotgnu (генерировать менее плохие машинные коды), LuaJit, asmjit (для x86 или amd64), LLVM (медленно генерировать оптимизированный машинный код). BTW, SBCL Общая реализация Lisp динамически компилируется в память и создает хороший машинный код во время выполнения (и есть также все JIT для JVM, которые это делают).