lunes, 18 de febrero de 2008

Formatos de binarios en Linux.

Linux soporta dos formatos de ejecutables, el a.out (Assembled OUTput), que fue el primero, y el ELF (Executable and Linking Format). a.out fue el formato de las primeras versiones tanto de Linux como de Unix. Sin embargo, hacia 1994, el equipo de desarrolladores de Linux decidió migrar de formato hacia el ELF, pues es mucho más flexible y manejable que el a.out. Este formato fue inicialmente desarrollado y diseñado por el USL (Unix System Laboratories), y se utiliza en los sistemas Unix del tipo SVR4 y Solaris 2.x.
Los programas ld.so y ld-linux.so* encuentran y cargan las bibliotecas compartidas requeridas por un programa, preparan al programa para ejecutarse y lo ejecutan. El programa ld.so maneja ficheros binarios con el formato a.out, ld-linux.so* maneja el formato ELF (/lib/ld-linux.so.1 para libc5, /lib/ld-linux.so.2 para glibc2), que es el que se lleva usando desde hace unos años. Por lo demás, ambos tienen el mismo comportamiento y usan los mismos ficheros de configuración y programas ldd, ldconfig y /etc/ld.so.conf.
Los formatos dominantes en UNIX son:
  • a.out(5) El formato objeto de UNIX más antiguo y “clásico”. Utiliza una cabecera corta y compacta con un número mágico al inicio que es usado frecuentemente para identificar el formato (vea a.out(5) para más información). Contiene tres segmentos cargados: .text, .data, y .bss además de una tabla de símbolos y una tabla de cadena (“strings”).
  • COFF El formato objeto de SVR3. La cabecera consiste en una tabla de sección, para que pueda ntener más contenido además de las secciones .text, .data, y .bss.
  • elf El sucesor de COFF; dispone de secciones múltiples y valores posibles de 32-bits o 64-bits. Una gran desventaja: ELF fué también diseñado asumiendo que solamente existiría una ABI por cada arquitectura de sistema. Esa suposición es en realidad bastante incorrecta y siquiera en el mundo comercial SYSV (el cual tiene al menos tres ABIs: SVR4, Solaris y SCO) se puede dar por buena.