<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="LinuxDoc-Tools 0.9.21"> <TITLE>Il Linux ELF HOWTO: Costruire programmi in ELF</TITLE> <LINK HREF="ELF-HOWTO-4.html" REL=next> <LINK HREF="ELF-HOWTO-2.html" REL=previous> <LINK HREF="ELF-HOWTO.html#toc3" REL=contents> </HEAD> <BODY> <A HREF="ELF-HOWTO-4.html">Avanti</A> <A HREF="ELF-HOWTO-2.html">Indietro</A> <A HREF="ELF-HOWTO.html#toc3">Indice</A> <HR> <H2><A NAME="s3">3.</A> <A HREF="ELF-HOWTO.html#toc3">Costruire programmi in ELF</A></H2> <H2><A NAME="ss3.1">3.1</A> <A HREF="ELF-HOWTO.html#toc3.1">Programmi ordinari</A> </H2> <P> Per costruire programmi in ELF, usate <CODE>gcc</CODE> come sempre. Per costruire programmi in formato a.out usate la forma <CODE>gcc -b i486-linuxaout </CODE>.</P> <P> <BLOCKQUOTE><CODE> <HR> <PRE> $ cat >hello.c main() { printf("hello, world\n"); } ^D $ gcc -o hello hello.c $ file hello hello: ELF 32-bit LSB executable i386 (386 and up) Version 1 $ ./hello hello, world </PRE> <HR> </CODE></BLOCKQUOTE> </P> <P>Questo è forse il momento appropriato per rispondere alla domanda ``se il compilatore in a.out per default produce un programma chiamato <CODE>a.out</CODE>, che nome gli darà un compilatore ELF?''. Sempre <CODE>a.out</CODE> è la risposta. Noia, noia, noia, ... <CODE> :-)</CODE></P> <H2><A NAME="ss3.2">3.2</A> <A HREF="ELF-HOWTO.html#toc3.2">Costruire le librerie</A> </H2> <P> Per costruire libfoo.so come libreria condivisa, i passi di base da compiere assomigliano a questi:</P> <P> <BLOCKQUOTE><CODE> <HR> <PRE> $ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o $ ln -s libfoo.so.1.0 libfoo.so.1 $ ln -s libfoo.so.1 libfoo.so $ export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH </PRE> <HR> </CODE></BLOCKQUOTE> </P> <P>questo genererà una libreria condivisa chiamata <CODE>libfoo.so.1.0</CODE>, e il collegamento appropriato per ld (<CODE>libfoo.so</CODE>) e il linker dinamico (<CODE>libfoo.so.1</CODE>) per trovarla. Per provare, aggiungiamo la directory corrente a <CODE>LD_LIBRARY_PATH</CODE>.</P> <P>Una volta contenti che la libreria funziona, bisogna spostarla, per esempio, in <CODE>/usr/local/lib</CODE>, e ricreare il link appropriato. Si noti che il link <CODE>libfoo.so</CODE> deve puntare a <CODE>libfoo.so.1</CODE>, così che non c'è bisogno di aggiornamenti ad ogni cambio della versione del minor number. il link da <CODE>libfoo.so.1</CODE> a <CODE>libfoo.so.1.0</CODE> è mantenuto a posto da <CODE>ldconfig</CODE>, che sulla maggior parte dei sistemi è fatto girare automaticamente al bootstrap.</P> <P> <BLOCKQUOTE><CODE> <HR> <PRE> $ su # cp libfoo.so.1.0 /usr/local/lib # /sbin/ldconfig # ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so ) </PRE> <HR> </CODE></BLOCKQUOTE> </P> <H2><A NAME="ss3.3">3.3</A> <A HREF="ELF-HOWTO.html#toc3.3">Programmi con il dynamic loading</A> </H2> <P> Questo argomento è trattato estensivamente nel documento di H. J. Lu `ELF programming' e nella pagina del manuale <CODE>dlopen(3)</CODE> che può essere trovata nel pacchetto ld.so. Qui c'è un piccolo esempio: fatene il link con <CODE>-ldl</CODE></P> <P> <BLOCKQUOTE><CODE> <HR> <PRE> #include <dlfcn.h> #include <stdio.h> main() { void *libc; void (*printf_call)(); if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY)) { printf_call=dlsym(libc,"printf"); (*printf_call)("hello, world\n"); } } </PRE> <HR> </CODE></BLOCKQUOTE> </P> <H2><A NAME="ss3.4">3.4</A> <A HREF="ELF-HOWTO.html#toc3.4">Debugging</A> </H2> <P> La vostra copia esistente del <CODE>gdb</CODE> funzionerà prevalentemente senza cambiamenti, con i programmi in ELF. La nuova versione nella directory <CODE>GCC</CODE> su tsx-11 è ritenuta migliore per fare il debugging dei programmi che usano le librerie condivise e il dinamic loading, e anche per capire i core dump dei programmi in ELF.</P> <P>Si noti che la serie di kernel 1.2 non possono generara i core dump dai programmi in ELF in nessun modo. La serie 1.3 invece può.</P> <HR> <A HREF="ELF-HOWTO-4.html">Avanti</A> <A HREF="ELF-HOWTO-2.html">Indietro</A> <A HREF="ELF-HOWTO.html#toc3">Indice</A> </BODY> </HTML>