Newsgroup: it.comp.programmare
Titolo: Le magie del cast

Parliamo di x86. Sappiamo che con un semplice stratagemma e' possibile 
castare un array di interi in un puntatore a funzione void->void e di 
conseguenza eseguirlo. Detto stratagemma e', per la cronaca e i posteri, 
questo:
int array[] = { opcodes }
void (*pf)(void);
pf = (void(*)(void)) array;
dove opcodes e' il vettore di opcode che vogliamo eseguire.
tutto bene se compilato ed eseguito in DOS o Win32, tutto veramente 
bene. Segmentation fault se compilato ed eseguito in linux. mi sono 
detto: sara' colpa che non posso usare int o robaccia strana in PMode e 
allora mi sono limitato ad inserire un 0x90, notoriamente una nop. 
Segmentation fault lo stesso. uguale mettendo solo degli innocui mov tra 
un gpr e l'altro.
Qualcuno mi spiega?
-- 
Morpheu5


Volentieri. Il problema e` che il tuo `semplice stratagemma' non e` 
lecito in standard C. Il fatto che funzioni dipende interamente da 
un'estensione del compilatore (ed eventualmente dall'approvazione del 
sistema operativo).
Con il primo compilatore (e/o primo sistema operativo) la cosa funziona. 
Dall'altra parte no. Quindi: o rimani sotto DOS o Win32, oppure ti devi 
documentare sul come (e se) puo` funzionare con un determinato 
compilatore sotto Linux.
Di piu` non so dirti...

 compilatore sotto Linux.
rispondo di qui che' mi sembra il NG piu' consono, a questo punto.
in windows uso niente meno che mingw32 che dovrebbe essere l'esatto port 
di gcc, da quel che so io. a questo punto sono tentato di credere che ci 
voglia il benestare del sistema operativo. dunque mi documentero' a 
dovere su come fare. qualche suggerimento?
il fatto e' che alcune routine time critical mi piacerebbe proprio 
poterle scrivere in assembly visto che riescono cosi' bene. il problema 
e' che la sintassi di as86 non mi piace manco per niente e preferisco 
scrivere per nasm che mi sembra avere una sintassi piu' aderente ai 
dettami Intel. inoltre non saprei come fare ad integrare i sorci as86 in 
un listato C per gcc... vabbe'. quindi mi compilo i sorci con nasm, li 
dumpo, li riporto nel vettore e il gioco e' fatto.
cmq grazie per il chiarimento.

 rispondo di qui che' mi sembra il NG piu' consono, a questo punto.
pardon, volevo rispondere in f.i.p.c...

 dovere su come fare. qualche suggerimento?
Forse su it.comp.os.linux.development possono aiutarti (verifica 
eventualmente che l'argomento sia in-topic, non saprei dato che non 
leggo quel gruppo).

voglia il benestare del sistema operativo.
   Direi che la eseguibilita` o meno, del segmento dati, dipende dal
SO piu` che dal compilatore. Con il prossimo service pack di windows
xp (se ho letto bene) dovresti cominciare ad avere problemi simili
anche in ambiente windows.
-- 
S.L.

 questo:
I kernel Linux (qualunque versione)
usano sia i segmenti che la memoria paginata.
In particolare sotto Linux esistono 4 (quattro)
segmenti: "codice kernel", "dati kernel",
"codice user", "dati user".
Da questi quattro grandi segmenti viene poi allocata
la memoria per i processi del kernel e per tutti i
programmi che la richiedono. Ovviamente il tuo array
sotto Linux è nel segmento "dati user", che altrettanto
ovviamente NON è marcato come eseguibile (eh sì, pure
la RAM ha i permessi. Ce li ha pure sotto Windows,
IN TEORIA... in pratica invece lì le cose vanno come
hai visto :-). Da qui il segmentation fault quando
cerchi di eseguirlo.
La soluzione migliore è quella di compilare i sorgenti
delle tue routine assembler con NASM e ottenere dei bei
moduli oggetto (.OBJ, hai presente? :-) che poi linkerai
insieme agli altri .OBJ che ti crea il GCC quando compila
il resto del tuo programma.

 il resto del tuo programma.
uhm. si', ho presente il fatto di obj e linking. il problema sta nel 
fatto che l'ho gia' provato e a nasm davo in pasto roba del tipo:
[global _nop]
_nop:
	ret
mentre a gcc davo in pasto:
#define nop _nop
void nop(void);
int main(void) {
	nop();
	return 0;
}
come suggerito un po' da tutte le guide e tutti i manuali. senonche' a 
quel punto mi becco un bel segfault di nuovo.
-- 
Morpheu5

 il resto del tuo programma.
In effetti io usavo sempre questo sistema, ora scrivo tutto in C o in C++
però deve essere ancora il sistema corretto.
ciao.

 Qualcuno mi spiega?
usa mmap per allocare memoria sicuramente eseguibile e scrivibile
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.5. C, C++ and ASM developers
                               and beta testers are welcome!