Ответ 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, которые это делают).