Avanti Indietro Indice

3. Costruire programmi in ELF

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


Avanti Indietro Indice