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