Desde sus primeras versiones, Linux soporta los binarios en formato a.out. Recientemente, el soporte para los binarios en el formato ELF a sido integrado en el núcleo y se ha hecho una distribución de las bibliotecas compartidas en formato ELF. Las ventajas de este formato en relación al formato a.out son muchas:
dlopen()
, dlsym()
y
dlclose()
Las ultimas versiones de las distribuciones están basadas en el formato ELF. Entonces, lo que sigue no tendría razón de ser si no tienes una versión antigua y si la quieres poner al día por ti mismo, cuidado, ello puede ser largo y peligroso.
La primera versión publica de los utilitarios y de las bibliotecas ELF se
difundió el domingo 21/05/95. La versión, al día de las bibliotecas ELF y de
los utensilios asociados esta disponible en los sitios FTP tsx-11.mit.edu
y
sunsite.unc.edu
así como en su espejo francés ftp.ibp.fr
en el
repertorio /pub/linux/GCC
.
Es posible utilizar esta distribución para poner al día sus bibliotecas.
Sin embargo, es aconsejable utilizar una distribución binaria con
base en ELF (como Slackware 3.1 o Red Hat 4.0).
Si quieres hacer la actualización tu mismo esta es la lista de archivos
requerida:
binutils-2.7.0.3.bin.tar.gz
: los utilitarios (as, ld,...), binutils-2.7.0.3.tar.gz
: las fuentes de utilitarios (as,ld...) gcc-2.7.2.1.bin.tar.gz
: el compilador GCC 2.7.2.1 ld.so-1.8.5.tar.gz
: el editor de lazos dinámico, libc-5.4.17.bin.tar.gz
: las bibliotecas en el formato ELF, libc-5.4.17.tar.gz
: las fuentes de bibliotecas, libg++-2.7.2.1.bin.tar.gz
: la biblioteca C++ en el formato ELF.
# cd /usr/src # tar xvfz /.../ld.so-1.8.5.tar.gz # cd ld.so-1.8.5 # sh instldso.sh
# mkdir<item>p /usr/i486-linuxaout/bin /usr/i486-linuxaout/lib # echo "/usr/i486-linuxaout/lib" >> /etc/ld.so.conf # ldconfig -v # cd /usr/lib # mv *.o *.a *.sa lib*.so.* /usr/i486-linuxaout/lib # cd /lib # mv *.o *.a *.sa lib*.so.* /usr/i486-linuxaout/lib # ldconfig -v # cd /usr # mv include /usr/i486-linuxaout
# cd / # tar xvfz /.../libc-5.4.17.bin.tar.gz # tar xvfz /.../libg++-2.7.2.1.bin.tar.gz # ldconfig -v
# cd / # tar xvfz /.../gcc-2.7.2.1.bin.tar.gz # rmr -f /usr/lib/ldscripts # rm -f /usr/bin/as /usr/bin/as.1.38.1l.2 /usr/bin/as.2.2l # rmf -f /usr/bin/ld /usr/bin/ld.1.9l.4 # tar xvfz /.../binutils-2.7.0.3.bin.tar.gz
Listo! Ahora tienes un sistema en el que coexisten bibliotecas en formatos a.out
(bajo /usr/i486-linuxaout/lib
) y ELF (bajo /lib
y /usr/lib
). Los
antiguos binarios siguen ejecutándose correctamente.
Cuidado! si utilizas sistemas de archivos diferentes para /
y /usr
,
existe el peligro de tener problemas al arranque de la maquina. De hecho
las bibliotecas antiguas estando en /usr/i486-linuxaout/lib
, no son
accesibles mientras que /usr
no se haya montado, lo que puede impedir el
arranque normal del sistema. Si estas en ese caso, debes imperativamente
desplazar al menos la imagen a.out de la biblioteca C:
# cd /usr/i486-linuxaout/lib # mv libc.so.* /lib # ldconfig -v
.
Habiendo instalado los utilitarios y las bibliotecas ELF no resta más que
recompilar todos los programas que utilizas par beneficiar de este nuevo
formato de ejecutable. Deber encontrar las fuentes de todos los programas
y compilarlas una por una (animo, porque te pude tomar largo tiempo :-). Puedes
también recuperar binarios ya compilados en los sitios FTP Linux, muchos
están ya en formato ELF.
Es de anotar que algunos programas requieren modificaciones para ser
compatibles con ELF, en particular el núcleo Linux (versión 1.2.x) así como
todos los programas que contengan bibliotecas compartidas.
En el sitio ftp.ibp.fr
, el directorio /pub/linux/ELF
contiene "patchs"
para algunos programas.
.
Las nuevas versiones del compilador y de los utilitarios generan
ejecutables en formato ELF, por defecto. Es posible crear ejecutables en
formato a.out utilizando la opción -b i486-linuxaout
durante el llamado de
gcc.
Ahora es fácil construir bibliotecas dinámicas. Los archivos fuente deben
ser compilados con la opción -fPIC
con el fin que el código generado pueda
ser ejecutado en cualquier dirección (las bibliotecas dinámicas se cargan en
direcciones imprevisibles y su código debe ser independiente de su
dirección física). La opción -shared
de gcc permite luego generar una
biblioteca dinámica.
Por ejemplo para generar una biblioteca libtruc.so.1.0
se utilizarían las
siguientes ordenes:
$ gcc -c -fPIC *.c $ gcc -shared -Wl,-soname,libtruc.so.1 -o libtruc.so.1.0 *.o
Algunos documentos que conciernen ELF están disponibles en ftp.ibp.fr
en
/pub/linux/ELF/doc
. Se trata de :
ELF.doc.tar.gz
la especificación del formato ELF ELF.ps.gz
un artículo de H.J. Lu donde describe la implementación del
formato ELF en Linux move_to_elf.gz
una descripción de la transición entre formatos a.out y ELF.