Newsgroup: it.comp.os.linux.development
Titolo: eseguire un buffer

Ciao a tutto il NG.
Ecco la questione:
Leggendo dal disco, leggo un file di tipo ELF e lo metto in un buffer di 
memoria, come faccio a mettere in esecuzione il contenuto di questo buffer ?
Grazie infinite.
Ciao

 ?
non può funzionare. Il file elf è composto da varie strutture, l'header e la
program table precedono il segmento .text che è quello eseguibile.
Ti consiglio di leggerti l'header ELF e sgamare l'entry point, quindi
converti l'indirizzo virtuale in un offset all'interno del tuo buffer,
quindi passa il controllo a quella locazione di memoria, usando un
puntatore a funzione.
Ancora meglio sarebbe imho leggere la symbol table dell'elf e trovare
l'indirizzo del main (in questo modo eviti di inizializzare inutilmente le
libc) cui trasferire il controllo con la modalità già descritta prima.
Prova un po' da solo, se hai bisogno di una mano ci risentiamo.
-- 
sed -r 's/\.UI|UI\.//g'

 buffer ?
ma non fai prima a chiamare una exec?
Inviato da X-Privat.Org - Registrazione gratuita 
http://www.x-privat.org/join.php

 la program table precedono il segmento .text che è quello eseguibile.
[cut]
ah, dimenticavo la cosa più importante, che l'elf è linkato in modo da
funzionare solo ad una determinata locazione di memoria, quindi devi fare
in modo di caricare il programma all'indirizzo scelto dal linker,
ricordandosi che pure la sezione .data deve essere caricata ad un indirizzo
fissato dal linker.
Più semplice sarebbe caricare un plain binary creato in modalità
position-independent-code, vedi 1po' tu cosa devi fare.
È un bel giochetto da realizzare, inutile ma 'istruttivo'.
In alternativa puoi usare dlopen ma solo su librerie condivise.
L'execve & C. (come ti hanno già suggerito) è l'unico modo semplice per fare
quello che chiedi ma suppongo tu abbia già vagliato questa ipotesi e voglia
sperimentare altre cose.


 ma non fai prima a chiamare una exec?
Dipende tutto dalla situazione in cui uno si trova, evidentemente no :)
Il file eseguibile si trova in una locazione remota, e lo ricevo tramite 
socket, e quindi quando finisce il trasferimento me lo ritrovo in un 
buffer di memoria e volevo evitare di passare dal disco sfruttando 
invece quello che gia' avevo nel buffer.
Grazie
	Ciao

 invece quello che gia' avevo nel buffer.
Invece potresti condividere con NFS e sfruttarne tutti i vantaggi in termini
di cacheing e di exec come il fsm comanda.
Ciao,
-- 
 Daniele Orlandi                                                        つづく

 di cacheing e di exec come il fsm comanda.
Ma per fare cio' bisognerebbe avere la possibilita' di installare e 
configurare il servizio su entrambe le macchine, cosa che non sempre si 
hanno le credenziali per farlo su entrambe (oltre che aggiungere un 
servizio per raggiungere uno scopo come questo, mi pare un po' alquanto 
esagerato).
Comunque grazie per il consiglio.
Ciao

 esagerato).
Hai requisiti di prestazioni tali per cui scrivere su un file, fare chmod(2)
e exec(2) non è fattibile ma non sei disposto a usare un filesystem
condiviso?
Spiega cosa vuoi fare, perché messa così non si capisce...


 condiviso?
E' che non ho proprio modo di mettere mano alla configurazione di una 
delle due macchine in gioco.
Grazie comunque per il consiglio.
ciao

 delle due macchine in gioco.
Vabbé, ma /tmp non devi mica configurarlo...
-- 
 Daniele Orlandi                                                        つづく

 
va beh, grazie.
E' una soluzione troppo diversa da quella che stavo pensando, la quale 
era sia per una mia "piccola" necessita', ma ancora di piu' per una mia 
curiosita'; Andare su una soluzione che cambia il problema non mi 
interessa ... mi piace complicarmi la vita ;)
Grazie comunque, ciao


bon, allora, a meno che tu non lo scriva in un file e non lo invochi con
una exec non puoi.


>> buffer ?
Se conosci l'inglese e l'assembly, potrebbe interessarti questo articolo:
http://linuxgazette.net/107/pramode.html
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila