Я работаю над приложением (написанным на С++), которое генерирует некоторый машинный код во время выполнения (Linux, x86-64 сейчас, но я планирую мигрировать на ARM). Затем он сохраняет сгенерированный код в памяти и выполняет его, перепрыгивая в ячейку памяти. Долгое время у меня была проблема с распределением исполняемой памяти, но я, наконец, решил ее, используя:
uint8_t *memory = mmap (NULL, length, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
Пока это работает, но я не уверен, что это элегантный способ делать такие вещи. Интересно, как это делает исполняемый загрузчик?