Vedere the answer I just posted per quella domanda. È possibile utilizzare la libreria callback(3)
per generare nuove funzioni in fase di esecuzione. Non è conforme agli standard, dal momento che comporta molti brutti attacchi specifici della piattaforma, ma funziona su un gran numero di sistemi.
La libreria si occupa dell'allocazione della memoria, assicurandosi che la memoria sia eseguibile e svuotando la cache delle istruzioni, se necessario, per garantire che il codice generato dinamicamente (ovvero la chiusura) sia eseguibile. Esso genera essenzialmente stub di codice che potrebbe essere simile a questo su x86:
pop %ecx
push $THUNK
push %ecx
jmp $function
THUNK:
.long $parameter
E poi restituisce l'indirizzo della prima istruzione. Ciò che questo stub fa è memorizzare l'indirizzo di ritorno in ECX (un registro scratch nella convenzione di chiamata x86), spinge un parametro extra nello stack (un puntatore a un thunk), e quindi re-spinge l'indirizzo di ritorno. Quindi, salta alla funzione effettiva. Ciò si traduce nel fatto che la funzione viene ingannata nel pensare di avere un parametro aggiuntivo, che è il contesto nascosto della chiusura.
In realtà è più complicato di quello (la funzione di vero e proprio chiamato alla fine dello stub è __vacall_r
, non la funzione stessa, e __vacall_r()
gestisce più dettagli di implementazione), ma questo è il principio di base.
fonte
2009-10-31 15:51:10
Non credo sia necessario fornire un collegamento alla pagina principale di stackoverflow.com nella domanda. –
La domanda a cui ci si collega è su come farlo in C++. Questa domanda è contrassegnata da C. Di chi vuoi sapere? –
La soluzione fornita da Barry è in C. La maggior parte dei commenti suggerisce che non è possibile risolvere la mia prima domanda in C++. – Alexandru