3. Costruire programmi in ELF

Indice di questa sezione

3.1 Programmi ordinari

Per costruire programmi in ELF, usate gcc come sempre. Per costruire programmi in formato a.out usate la forma gcc -b i486-linuxaout .


$ 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

Questo è forse il momento appropriato per rispondere alla domanda ``se il compilatore in a.out per default produce un programma chiamato a.out, che nome gli darà un compilatore ELF?''. Sempre a.out è la risposta. Noia, noia, noia, ... :-)

3.2 Costruire le librerie

Per costruire libfoo.so come libreria condivisa, i passi di base da compiere assomigliano a questi:


$ 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

questo genererà una libreria condivisa chiamata libfoo.so.1.0, e il collegamento appropriato per ld (libfoo.so) e il linker dinamico (libfoo.so.1) per trovarla. Per provare, aggiungiamo la directory corrente a LD_LIBRARY_PATH.

Una volta contenti che la libreria funziona, bisogna spostarla, per esempio, in /usr/local/lib, e ricreare il link appropriato. Si noti che il link libfoo.so deve puntare a libfoo.so.1, così che non c'è bisogno di aggiornamenti ad ogni cambio della versione del minor number. il link da libfoo.so.1 a libfoo.so.1.0 è mantenuto a posto da ldconfig, che sulla maggior parte dei sistemi è fatto girare automaticamente al bootstrap.


$ su
# cp libfoo.so.1.0 /usr/local/lib
# /sbin/ldconfig
# ( cd /usr/local/lib ; ln -s libfoo.so.1 libfoo.so )

3.3 Programmi con il dynamic loading

Questo argomento è trattato estensivamente nel documento di H. J. Lu `ELF programming' e nella pagina del manuale dlopen(3) che può essere trovata nel pacchetto ld.so. Qui c'è un piccolo esempio: fatene il link con -ldl


#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");
  }

}

3.4 Debugging

La vostra copia esistente del gdb funzionerà prevalentemente senza cambiamenti, con i programmi in ELF. La nuova versione nella directory GCC 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.

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ò.


Capitolo Successivo, Capitolo Precedente

Indice di questo capitolo, Indice generale

Inizio del documento, Inizio di questo Capitolo