Вам не нужно загружать код, сгенерированный в памяти, поскольку он уже находится в памяти!
Однако вы можете - непереносимым способом - генерировать машинный код в памяти (при условии, что он находится в сегменте памяти mmap -ed с флагом PROT_EXEC
).
(в этом случае не требуется этап "связывания" или перемещения, поскольку вы генерируете машинный код с определенными абсолютными или относительными адресами, в частности, для вызова внешних функций)
Существуют некоторые библиотеки, которые делают это: В GNU / Linux под x86 или x86-64 , я знаю о GNU Lightning (которая быстро генерирует машинный код который работает медленно), DotGNU LibJIT (который генерирует код среднего качества) и LLVM & GCCJIT (который может генерировать довольно оптимизированный код в памяти, но требуется время, чтобы его испустить). И у LuaJit тоже есть нечто подобное. С 2015 года GCC 5 имеет библиотеку gccjit .
И, конечно, вы все равно можете сгенерировать код C в файле, разветвить компилятор, чтобы скомпилировать его в общий объект, и добавить этот общий объектный файл. Я делаю это в GCC MELT , доменном языке для расширения GCC. На практике это работает довольно хорошо.
добавления
Если производительность записи сгенерированного файла C вызывает беспокойство (не должно быть, поскольку компиляция файла C намного медленнее, чем его запись), рассмотрите возможность использования для этого некоторой файловой системы tmpfs (возможно, в /tmp/
, которая часто является tmpfs файловой системой в Linux)