Previous Next Table of Contents

14. ELF

14.1 Introducción

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:

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.

14.2 Instalación

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:

Se deben seguir escrupulosamente las siguientes instrucciones. De hecho es fácil dañar el sistema con esta maniobra, sobre todo durante la transición entre los formatos a.out y ELF.

  1. instalación del editor de lazos dinámico.
     
    # cd /usr/src 
    # tar xvfz /.../ld.so-1.8.5.tar.gz 
    # cd ld.so-1.8.5 
    # sh instldso.sh 
    
  2. Salvar las bibliotecas precedentes (en formato a.out)
     
         # 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 
    
  3. instalación de nuevas bibliotecas
     
    # cd / 
    # tar xvfz /.../libc-5.4.17.bin.tar.gz 
    # tar xvfz /.../libg++-2.7.2.1.bin.tar.gz 
    # ldconfig -v 
    
  4. instalación de nuevos utilitarios
    # 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 

14.3 Migración hacia un sistema todo ELF

.

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.

14.4 utilización de los utilitarios ELF

.

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 

14.5 Fuentes de información sobre ELF

Algunos documentos que conciernen ELF están disponibles en ftp.ibp.fr en /pub/linux/ELF/doc. Se trata de :

También es posible aprender más sobre ELF en estas URL:


Previous Next Table of Contents