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