Newsgroup: it.comp.lang.c
Titolo: Informazioni su un plugin caricato dinamicamente

Ciao a tutti!
Per un programma che sto scrivendo voglio avere la possibilita' di
scrivere dei Plugins.
Il meccanismo di caricamento mi e' chiaro e gli esperimenti che ho fatto
in tal senso mi hanno soddisfatto appieno.
L'unica cosa che vorrei fare e' poter leggere una qualche descrizione del
Plugin stesso PRIMA di caricarlo.
Idealmente darei all'utente una lista di Plugins da scegliere e, una volta
che l'utente ha fatto la sua scelta, il Plugin verra' caricato ed eseguito.
Pero', gia' sulla lista, verra' scritta una breve descrizione del Plugin
stesso.
Ora, certamente potrei caricare il Plugin e lanciare una qualche funzione
che mi ritorna una stringa che e' la mia descrizione, ma la cosa non mi
piace per niente (teoricamente ho un numero anche molto grande di Plugins
e caricare ogni volta il file, linkarlo dinamicamente, lanciare la
funzione e scaricare il modulo e' un bel po' di lavoro da far fare alla
povera CPU).
Sono dell'idea che dovrebbe essere possibile, senza caricare il plugin!,
leggere una qualche definizione, tipo una stringa passata a gcc al momento
della compilazione, e quindi dare all'utente questa stringa per scegliere.
Solo che non so come fare... :)
Qualcuno mi sa dare un consiglio? Uso gcc 4.2.4 su Ubuntu Hardy.
Il Plugin lo compilo cosi':
gcc -fpic -c plugin.c
gcc -shared -Wl,-soname,plugin.lib -o plugin.lib plugin.o
ed esporto quindi una funzione che verra' chiamata dal programma
principale, dopo aver caricato il Plugin con dlopen.
Grazie dei consigli!
Luca Bertoncello
(
luca...@lucabert.de
)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Qualcuno mi sa dare un consiglio?
Quello che tu vuoi fare, essenzialmente, e' aggiungere una nuova
sezione all'immagine binaria del tuo programma.
Su Linux e Solaris, le immagini binarie sono in formato ELF.
Il formato ELF e' descritto in vari documenti su internet, ed e'
estensibile con sezioni che tu puoi aggiungere in coda al file, che tu
puoi poi leggerti senza dover caricare la DLL in memoria eseguibile.
C'e' una libreria, libelf, che ti permette di fare varie modifiche ad
un'immagine e di leggere le modifiche al runtime.
Ce ne un'altra chiamata libbfd che viene usata da vari tools GNU per
accedere a molti formati binari, tra cui ELF.
Puoi anche manipolare l'immagine tu manualmente, o attraverso un tool
che tu ti puoi creare, oppure attraverso le direttive speciali pragma
del compilatore. Addirittura se vuoi puoi manipolare il testo del tuo
programma in Assembly prima della compilazione, se per caso le pragma
del gcc non sono sufficienti.

P.S.
In alternativa, puoi richiedere che l'autore del plugin metta la
descrizione del plugin stesso in una string literal con un inizio
particolare.
Le stringhe literals sono quasi sempre posizionate nella
sezione .rodata del file ELF, per cui ti basta poi leggere quella
sezione e cercare la stringa che inizia con quel prefisso unico.
Se provi a usare objdump e readelf e vedrai di cosa parlo.

 P.S.



L'autore dei Plugins, al momento, sono io...
E io non so da che parte iniziare... :)
Mi puoi magari dare un piccolo esempio?
Ciao



L'esempio non riguarda piu' lo C... riguarda Linux.
Appena ho un po' di tempo stasera metto giu' qualcosa di semplice.
Comunque per iniziare, compila il tipico esempio Hello World in C con
il gcc, usando l'opzione -S.
E poi guarda all'inizio del file '.s' prodotto il comando section.

Eccomi qui di nuovo.
In base a quello che volevi fare con i plugin, mi e' venuto in mente
di crearmi il mio editor di file ELF con una bella libreria di
supporto.
Il tool si chiamera' `elftool` e la libreria `libelftool`.
Per il momento, ho sviluppato un piccolo prototipo per farti vedere
come leggere un file di tipo ELF e tirar fuori una stringa.
Eccolo qui: 
http://elfsigntool.sourceforge.net/
Il prototipo e' molto succinto, ma e' sviluppato come programma
letterato usando un altro tool mio, eWEB, che e' basato su AsciiDoc.
Se qualcosa non e' chiara fammi sapere.
Nel frattempo io mi sviluppo il mio editor di file ELF che e' anche un
bell'esercizio per imparare finalmente GDK+.