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, ... :-)
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 )
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");
}
}
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