Newsgroup: it.comp.lang.c++
Titolo: generare codice macchina ed eseguirlo

è possibile generare del codice macchina ed eseguirlo, run-time?
ho bisogno di costruire del codice al volo (in linguaggio macchina), 
passandogli un array di byte per l'elaborazione.
l'utilizzo sarebbe per l'emulatore di un antivirus.
posso farlo? se sì, come?
grazie!
saverio m. 

è possibile generare del codice macchina ed eseguirlo, run-time?
ricordo che il compilatore BORLAND metteva a disposizione la funzione:
                __emit__(opcode)
che dovrebbe fare al caso tuo.

ombra ha scritto:

uhm, non più di tanto in realtà : l'opcode veniva inserito 
inline, "as such" e "where it was", ma entro il programma 
corrente, non veniva creato nessun programma indipendente né 
eseguito un processo figlio. In sostanza "__emit" era, 
solamente, una estensione per smanettoni davvero esperti, al 
limitato assembler inline che supportava processori non 
modernissimi e manco tutte le istruzioni dei vecchi.
Ciao
Soviet_Mario

 l'utilizzo sarebbe per l'emulatore di un antivirus.
la via più semplice che mi viene in mente è quella di creare un file 
.COM su disco e poi mandarlo in esecuzione.
Se non vuoi passare da disco la cosa mi pare problematica: dovresti 
allocare uno spazio in memoria dallo heap, poi cambiare il tipo di 
segmento e impostarlo a codice eseguibile, poi eseguirlo. Non so se sia 
possibile.
Ah: sei OT...

 Ah: sei OT...
eh si .... innegabile
ciao
Soviet

Ho scoperto (cercando tutt'altro) che è possibile farlo con molta 
semplicita':
unsigned char foobar[] = "\x90\x90\x90\x90\x90\x90\x90\x90\xC3";
((void(*)())&foobar)();
Ciao!
Saverio M.
"Soviet_Mario" <Sov...@MIR.CCCP> ha scritto nel messaggio 
news:sYMmh.97282$uv5.1...@twister1.libero.it...


 ((void(*)())&foobar)();
beh, probabilmente avevo frainteso la domanda interpretandola in 
senso troppo esteso .... questa è solo una chiamata di funzione, 
mentre pensavo che tu volessi generare PROGRAMMI interi (e non 
pezzi di codice locale) da "shellare" o lanciare come processi 
figli, indipendenti.
Inoltre avevi parlato di generazione a runtime, mentre 
l'inizializzazione, come avevo scritto, è roba statica (però 
forse hai omesso la parte di codice che modifica la stringa 
esadecimale)
Cmq, cosa ti dice il compilatore quando fai il cast da array di 
caratteri a puntatore a funzione void F (void) ??
In secondo luogo, ti occupi tu del mantenimento dell'integrità 
dello stack frame ? tipo mov sp, bp; pop sp; o roba del genere ?
Hai provato la tua soluzione dentro o fuori dal debugger, 
eventualmente ?
Se funge bene .... è interessante !
ciao
Soviet


 Hai provato la tua soluzione dentro o fuori dal debugger, eventualmente ?
dunque.
finora ho provato poche e semplici operazioni ed è andata bene, sia in debug 
che non.
pensando a cose più impegnative, ovviamente mi dovrò occupare di salvare 
tutti i registri; per quanto riguarda lo stack, in realtà avrei intenzione 
di creare uno stack all'interno dell'array, che rappresenterebbe la memoria 
"virtuale".
Anche se non dovesse funzionare nella mia implementazione, considera che i 
meccanismi di JITting delle virtual machine (JVM/.NET e così via) 
probabilmente fanno una cosa molto simile.
Ciao!
Saverio 

 Se funge bene .... è interessante !
Comunque non e' detto che continui a funzionare anche domani =)
Se domattina il signor sistema operativo decide, ad un certo punto, che 
le aree dati non devono essere eseguibili (come sarebbe sensato), il 
programma cessa di funzionare.
Ciao,
--Marco