Generowanie funkcji w czasie wykonywania w C
Chciałbym wygenerować funkcję w czasie wykonywania w C. Mam na myśli, że zasadniczo chciałbym przydzielić trochę pamięci, wskazać na nią i wykonać ją za pomocą wskaźnika funkcji. Zdaję sobie sprawę, że to bardzo złożony temat i moje pytanie jest naiwne. Zdaję sobie również sprawę z tego, że istnieją bardzo solidne biblioteki, które to robią (np.nanojit).
Ale chciałbym nauczyć się tej techniki, zaczynając od podstaw. Czy ktoś, kto ma wiedzę, da mi bardzo prosty przykład w C?
EDYTOWAĆ: Odpowiedź poniżej jest świetna, ale oto ten sam przykład dla systemu Windows:
#include <Windows.h>
#define MEMSIZE 100*1024*1024
typedef void (*func_t)(void);
int main() {
HANDLE proc = GetCurrentProcess();
LPVOID p = VirtualAlloc(
NULL,
MEMSIZE,
MEM_RESERVE|MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
func_t func = (func_t)p;
PDWORD code = (PDWORD)p;
code[0] = 0xC3; // ret
if(FlushInstructionCache(
proc,
NULL,
0))
{
func();
}
CloseHandle(proc);
VirtualFree(p, 0, MEM_RELEASE);
return 0;
}