Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > media > main-release > by-pkgid > e05c4514608e650af9b28d9be1d35a18 > files > 361

howto-html-it-10.1-4mdv2008.1.noarch.rpm

<!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 &egrave; 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&agrave; un compilatore ELF?''. Sempre
<CODE>a.out</CODE> &egrave; 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&agrave; 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&igrave; che non c'&egrave; 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> &egrave; mantenuto a posto da <CODE>ldconfig</CODE>, che
sulla maggior parte dei sistemi &egrave;  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 &egrave; trattato estensivamente nel documento di H. J. Lu 
`ELF programming' e nella pagina del manuale <CODE>dlopen(3)</CODE> 
che pu&ograve;  essere trovata nel pacchetto ld.so. Qui c'&egrave; un piccolo esempio:
fatene il link con <CODE>-ldl</CODE></P>
<P>
<BLOCKQUOTE><CODE>
<HR>
<PRE>
#include &lt;dlfcn.h>
#include &lt;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&agrave; prevalentemente
senza cambiamenti, con i programmi in ELF.
La nuova versione nella directory <CODE>GCC</CODE> su tsx-11 &egrave; 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&ograve;.</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>