
En informática , el formato ejecutable y enlazable [2] ( ELF , anteriormente denominado Extensible Linking Format ) es un formato de archivo estándar común para archivos ejecutables , código objeto , bibliotecas compartidas y volcados de memoria . Publicado por primera vez en la especificación para la interfaz binaria de aplicación (ABI) de la versión del sistema operativo Unix denominada System V Release 4 (SVR4), [3] y más tarde en el Tool Interface Standard, [1] fue rápidamente aceptado entre los diferentes proveedores de sistemas Unix . En 1999, fue elegido como el formato de archivo binario estándar para Unix y sistemas similares a Unix en procesadores x86 por el proyecto 86open.
Por diseño, el formato ELF es flexible, extensible y multiplataforma . Por ejemplo, admite distintos ordenes de bytes y tamaños de direcciones, por lo que no excluye ninguna arquitectura de CPU o conjunto de instrucciones en particular. Esto ha permitido que muchos sistemas operativos diferentes lo adopten en muchas plataformas de hardware diferentes .
Diseño de archivo
Cada archivo ELF se compone de un encabezado ELF, seguido de los datos del archivo. Los datos pueden incluir:
- Tabla de encabezado de programa, que describe cero o más segmentos de memoria
- Tabla de encabezado de sección, que describe cero o más secciones
- Datos a los que hacen referencia las entradas de la tabla de encabezado del programa o de la tabla de encabezado de sección

Los segmentos contienen información necesaria para la ejecución del archivo en tiempo de ejecución , mientras que las secciones contienen datos importantes para la vinculación y la reubicación. Cualquier byte de todo el archivo puede pertenecer a una sección como máximo, y pueden aparecer bytes huérfanos que no pertenecen a ninguna sección.
Encabezado ELF
El encabezado ELF define si se deben utilizar direcciones de 32 o 64 bits . El encabezado contiene tres campos que se ven afectados por esta configuración y desplazan otros campos que los siguen. El encabezado ELF tiene una longitud de 52 o 64 bytes para binarios de 32 y 64 bits respectivamente.
Encabezado del programa
La tabla de encabezados del programa le indica al sistema cómo crear una imagen de proceso. Se encuentra en el desplazamiento del archivo e_phoff y consta de entradas e_phnum , cada una con un tamaño e_phentsize . El diseño es ligeramente diferente en ELF de 32 bits frente a ELF de 64 bits , porque los p_flags están en una ubicación de estructura diferente por razones de alineación. Cada entrada está estructurada como:
Encabezado de sección
Herramientas
readelfes una utilidad binaria de Unix que muestra información sobre uno o más archivos ELF. GNU Binutils ofrece una implementación de software libre .elfutilsProporciona herramientas alternativas a GNU Binutils exclusivamente para Linux. [10]elfdumpes un comando para ver información ELF en un archivo ELF, disponible en Solaris y FreeBSD .objdumpProporciona una amplia gama de información sobre archivos ELF y otros formatos de objetos.objdumpUtiliza la biblioteca Binary File Descriptor como back-end para estructurar los datos ELF.- La utilidad Unix
filepuede mostrar cierta información sobre archivos ELF, incluida la arquitectura del conjunto de instrucciones para el cual está destinado el código en un archivo de objeto reubicable, ejecutable o compartido, o en el que se produjo un volcado de núcleo ELF.
Aplicaciones
Sistemas tipo Unix
El formato ELF ha reemplazado a los formatos ejecutables más antiguos en varios entornos. Ha reemplazado a los formatos a.out y COFF en sistemas operativos tipo Unix :
- Linux
- Solaris / Illumos
- IRIX
- FreeBSD [11]
- NetBSD
- OpenBSD
- Redox
- Libélula BSD
- Sílaba
- HP-UX (excepto los programas PA-RISC de 32 bits que continúan usando SOM )
- Neutrino QNX
- Minix [12]
Adopción de sistemas no Unix
ELF también ha sido adoptado en sistemas operativos no Unix, como:
- OpenVMS , en sus versiones Itanium y amd64 [13]
- Revisión 4 de BeOS y posteriores para computadoras basadas en x86 (donde reemplazó al formato ejecutable portátil ; la versión PowerPC se quedó con el formato ejecutable preferido )
- Haiku , una reimplementación de código abierto de BeOS
- Sistema operativo RISC [14]
- Stratus VOS , en versiones PA-RISC y x86
- Sistema operativo SkyOS
- Sistema operativo Fuchsia
- Z/TPF
- Sistema operativo HPE NonStop [15]
- Deos
Microsoft Windows también utiliza el formato ELF, pero sólo para su sistema de compatibilidad con el Subsistema de Windows para Linux . [16]
Consolas de juegos
Algunas consolas de juegos también utilizan ELF:
- PlayStation Portable , [17] PlayStation Vita , PlayStation (consola) , PlayStation 2 , PlayStation 3 , PlayStation 4 , PlayStation 5
- GP2X
- Dreamcast
- Cubo de juego
- Nintendo 64
- Wii
- Wii U
PC de potencia
Otros sistemas (operativos) que se ejecutan en PowerPC y que utilizan ELF:
- AmigaOS 4 , el ejecutable ELF ha reemplazado al anterior Extended Hunk Format (EHF) que se usaba en Amigas equipados con tarjetas de expansión de procesador PPC.
- MorphOS
- AROS
- Café OS (El sistema operativo que ejecuta la Wii U)
Teléfonos móviles
Algunos sistemas operativos para teléfonos móviles y dispositivos móviles utilizan ELF:
- Symbian OS v9 utiliza el formato E32Image [18] que se basa en el formato de archivo ELF;
- Sony Ericsson , por ejemplo, el W800i , W610 , W300 , etc.
- Siemens , las plataformas SGOLD y SGOLD2: desde Siemens C65 hasta S75 y BenQ-Siemens E71/ EL71 ;
- Motorola , por ejemplo, el E398, SLVR L7 , v360, v3i (y todos los teléfonos LTE2 que tengan el parche aplicado).
- Bada , por ejemplo, el Samsung Wave S8500 .
- Teléfonos o tabletas Nokia que ejecutan el sistema operativo Maemo o Meego, por ejemplo, el Nokia N900 .
- Android utiliza bibliotecas ELF .so (objeto compartido [19] ) para la interfaz nativa de Java . [ cita requerida ] Con Android Runtime (ART), el valor predeterminado desde Android 5.0 "Lollipop" , todas las aplicaciones se compilan en binarios ELF nativos en la instalación. [20] También es posible utilizar software nativo de Linux desde administradores de paquetes como Termux, o compilarlos desde fuentes a través de Clang o GCC, que están disponibles en repositorios.
Algunos teléfonos pueden ejecutar archivos ELF mediante el uso de un parche que agrega código ensamblador al firmware principal , que es una característica conocida como ELFPack en la cultura del modding underground . El formato de archivo ELF también se usa con las arquitecturas de microcontroladores Atmel AVR (8 bits), AVR32 [21] y Texas Instruments MSP430 . Algunas implementaciones de Open Firmware también pueden cargar archivos ELF, en particular la implementación de Apple utilizada en casi todas las máquinas PowerPC que produjo la compañía.
Presupuesto
- Genérico:
- Interfaz binaria de aplicación System V, edición 4.1 (18 de marzo de 1997)
- Actualización de ABI del sistema V (octubre de 2009)
- AMD64 :
- Suplemento ABI del sistema V, AMD64
- Brazo :
- ELF para la arquitectura ARM
- IA-32 :
- Suplemento del procesador de arquitectura Intel386, ABI del sistema V
- IA-64 :
- Guía de convenciones y tiempos de ejecución del software Itanium (septiembre de 2000)
- M32R :
- Suplemento ABI M32R ELF versión 1.2 (26 de agosto de 2004)
- MIP :
- Suplemento del procesador System V ABI, MIPS RISC
- Documentación de MIPS EABI Archivado el 1 de abril de 2012 en Wayback Machine (11 de junio de 2003)
- Motorola 6800 :
- ABI integrada de 8 y 16 bits de Motorola
- PA-RISC :
- Suplemento ELF para PA-RISC versión 1.43 (6 de octubre de 1997)
- PC de potencia :
- Sistema V ABI, Suplemento PPC
- Implementación de interfaz binaria de aplicación integrada PowerPC de 32 bits (1 de octubre de 1995)
- Suplemento de interfaz binaria de aplicación PowerPC ELF de 64 bits, versión 1.9 (2004)
- RISC-V :
- Especificación ELF de RISC-V
- SPARC :
- Sistema V ABI, suplemento SPARC
- S/390 :
- Suplemento ABI ELF de 32 bits S/390
- Serie z :
- Suplemento ABI ELF de 64 bits de la serie z
- Sistema operativo Symbian 9:
- Formato de archivo de imagen E32 en Symbian OS 9
La base estándar de Linux (LSB) complementa algunas de las especificaciones anteriores para las arquitecturas en las que se especifica. [22] Por ejemplo, ese es el caso del suplemento AMD64 de System V ABI. [23] [24]
86abierto
86open fue un proyecto para formar consenso sobre un formato de archivo binario común para sistemas operativos Unix y similares a Unix en la arquitectura x86 compatible con PC común, para alentar a los desarrolladores de software a migrar a la arquitectura. [25] La idea inicial era estandarizar un pequeño subconjunto de Spec 1170, un predecesor de la Single UNIX Specification , y la Biblioteca C de GNU (glibc) para permitir que binarios sin modificar se ejecuten en los sistemas operativos x86 similares a Unix. El proyecto originalmente se denominó "Spec 150".
El formato finalmente elegido fue ELF, específicamente la implementación de ELF para Linux, después de que resultó ser un estándar de facto respaldado por todos los proveedores y sistemas operativos involucrados.
El grupo comenzó a discutir por correo electrónico en 1997 y se reunió por primera vez en las oficinas de la Operación Santa Cruz el 22 de agosto de 1997.
El comité directivo estuvo formado por Marc Ewing , Dion Johnson, Evan Leibovitch, Bruce Perens , Andrew Roach, Bryan Wayne Sparks y Linus Torvalds . Otras personas que participaron en el proyecto fueron Keith Bostic , Chuck Cranor, Michael Davidson, Chris G. Demetriou, Ulrich Drepper, Don Dugger, Steve Ginzburg, Jon "maddog" Hall , Ron Holt, Jordan Hubbard , Dave Jensen, Kean Johnston, Andrew Josey, Robert Lipe, Bela Lubkin, Tim Marsland, Greg Page, Ronald Joe Record, Tim Ruckle, Joel Silverstein, Chia-pi Tien y Erik Troan. Los sistemas operativos y las empresas representadas fueron BeOS , BSDI , FreeBSD , Intel , Linux , NetBSD , SCO y SunSoft .
El proyecto progresó y a mediados de 1998, SCO comenzó a desarrollar lxrun , una capa de compatibilidad de código abierto capaz de ejecutar binarios de Linux en OpenServer , UnixWare y Solaris . SCO anunció el soporte oficial de lxrun en LinuxWorld en marzo de 1999. Sun Microsystems comenzó a soportar oficialmente lxrun para Solaris a principios de 1999, [26] y más tarde pasó al soporte integrado del formato binario de Linux a través de Solaris Containers for Linux Applications .
Como los BSD habían soportado durante mucho tiempo los binarios de Linux (a través de una capa de compatibilidad ) y los principales proveedores de Unix x86 habían agregado soporte para el formato, el proyecto decidió que Linux ELF era el formato elegido por la industria y "se declaró disuelto" el 25 de julio de 1999. [27]
FatELF: binarios universales para Linux
FatELF es una extensión de formato binario ELF que agrega capacidades binarias fat . [28] Está destinado a Linux y otros sistemas operativos similares a Unix . Además de la abstracción de la arquitectura de la CPU ( orden de bytes , tamaño de palabra , conjunto de instrucciones de la CPU , etc.), existe la ventaja potencial de la abstracción de la plataforma de software, por ejemplo, binarios que admiten múltiples versiones de ABI del kernel . A partir de 2021 , FatELF no se ha integrado en el kernel principal de Linux. [29] [30] [31][actualizar]
Véase también
- Interfaz binaria de la aplicación
- Comparación de formatos de archivos ejecutables
- DWARF : un formato para depurar datos
- Estándar de compatibilidad binaria de Intel
- Ejecutable portátil : formato utilizado por Windows
- vDSO – DSO virtual
- Código independiente de la posición
Referencias
- ^ Especificación del formato ejecutable y de enlace (ELF) del estándar de interfaz de herramientas (TIS), versión 1.2 (mayo de 1995)
- ^ Especificación de formatos portátiles del estándar de interfaz de herramientas (TIS), versión 1.1 (octubre de 1993)
- ^ Interfaz binaria de aplicación System V , edición 4.1 (18 de marzo de 1997)
- ^ "Encabezado ELF". Sco.com. Julio de 2000. Consultado el 7 de febrero de 2014 .
- ^ "LXR linux/include/linux/elf.h". linux.no . Consultado el 27 de abril de 2015 .
- ^ "Anuncio de glibc 2.12".
- ^ "sourceware.org Git - glibc.git/blob - libc-abis".
- ^ "sourceware.org Git - glibc.git/blob - sysdeps/gnu/ldsodefs.h". Archivado desde el original el 7 de marzo de 2021. Consultado el 28 de octubre de 2019 .
- ^ "Encabezado de programa". Sco.com. Julio de 2000. Consultado el 5 de abril de 2017 .
- ^ "elfutils". sourceware.org . Consultado el 30 de abril de 2017 .
- ^ "Formatos binarios". Archivado desde el original el 2019-03-31 . Consultado el 2019-03-31 .
- ^ "MinixReleases – Minix Wiki". Wiki.minix3.org. Archivado desde el original el 2013-03-30 . Consultado el 2014-01-19 .
- ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 15 de septiembre de 2020. Consultado el 19 de octubre de 2016 .
{{cite web}}: CS1 maint: copia archivada como título ( enlace ) - ^ "GCCSDK – RISC OS". Riscos.info. 22 de abril de 2012. Archivado desde el original el 19 de febrero de 2014. Consultado el 19 de enero de 2014 .
- ^ "Guía del programador de Guardian" (PDF) . Hewlett Packard Enterprise. Archivado desde el original (PDF) el 2018-05-30 . Consultado el 2018-05-30 .p. 44 archivado del original el 30-5-2018
- ^ Foley, Mary Jo. "Bajo el capó del subsistema Windows de Microsoft para Linux". ZDNet . Consultado el 19 de agosto de 2016 .
- ^ PlayStation Portable utiliza ELF cifrado y reubicado: PSP
- ^ Formato de archivo ejecutable del sistema operativo Symbian
- ^ Rosen, Kenneth; Host, Douglas; Klee, Rachel; Rosinski, Richard (2007). UNIX: The Complete Reference (2.ª edición). McGraw Hill Professional. pág. 707. ISBN
9780071706988. Recuperado el 8 de junio de 2017.
Las bibliotecas vinculadas dinámicamente también se denominan objetos compartidos (.so).
- ^ Thomas, Romain. «Formatos Android». Quarks Lab . Archivado desde el original el 16 de febrero de 2023. Consultado el 17 de enero de 2023 .
- ^ "Capítulo 4: Archivos de objetos", Interfaz binaria de aplicación de System V , 26 de octubre de 2009, e_machine
- ^ "Especificaciones referenciadas de LSB". linuxfoundation.org . Consultado el 27 de abril de 2015 .
- ^ "Formato ejecutable y de enlace (ELF)". linuxfoundation.org . Consultado el 27 de abril de 2015 .
- ^ "Introducción". linuxfoundation.org . Consultado el 27 de abril de 2015 .
- ^ Leibovitch, Evan (23 de diciembre de 1997). «86Open Frequently-Asked Questions». Archivado desde el original el 11 de marzo de 2007. Consultado el 6 de junio de 2007 .
- ^ Record, Ronald (21 de mayo de 1998). "Boletín sobre el estado de 86open en la SCO". Archivado desde el original el 8 de diciembre de 2008. Consultado el 6 de mayo de 2008 .
- ^ Leibovitch, Evan (25 de julio de 1999). «The86open Project – Final Update». Archivado desde el original el 27 de febrero de 2007. Consultado el 6 de mayo de 2007 .
- ^ Gordon, Ryan. "fatelf-specification v1". icculus.org . Consultado el 25 de julio de 2010 .
- ^ Gordon, Ryan. "FatELF: Resulta que me gustaba más la incertidumbre". icculus.org . Consultado el 13 de julio de 2010 .
- ^ Holwerda, Thom (3 de noviembre de 2009). "Ryan Gordon detiene el proyecto FatELF". osnews.com . Consultado el 5 de julio de 2010 .
- ^ Brockmeier, Joe (23 de junio de 2010). "SELF: Anatomía de un (supuesto) fracaso". Linux Weekly News . Consultado el 6 de febrero de 2011 .
Lectura adicional
- Levine, John R. (2000) [octubre de 1999]. Linkers and Loaders. La serie Morgan Kaufmann sobre ingeniería de software y programación (1.ª edición). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382. Archivado desde el original el 5 de diciembre de 2012. Consultado el 12 de enero de 2020 .Código: [1][2] Erratas: [3]
- Ulrich Drepper, How To Write Shared Libraries, versión 4.1.2 (2011). Publicado en la página web del autor, https://www.akkadia.org/drepper.
- Un héroe anónimo: el ELF, un hombre muy trabajador, por Peter Seebach, 20 de diciembre de 2005, archivado desde el original el 24 de febrero de 2007
- LibElf y GElf: una biblioteca para manipular archivos ELf en Wayback Machine (archivado el 25 de febrero de 2004)
- El formato de archivo de objeto ELF: Introducción , El formato de archivo de objeto ELF por análisis por Eric Youngdale (1995-05-01)
- Un tutorial relámpago sobre cómo crear ejecutables ELF realmente pequeños para Linux por Brian Raiter
- Reubicación de ELF en objetos no reubicables por Julien Vanegue (13 de agosto de 2003)
- Depuración de ELF integrada sin ptrace por el equipo ELFsh (1 de agosto de 2005)
- Estudio de la carga ELF y las reubicaciones por Pat Beirne (1999-08-03)
Enlaces externos
- Manual de FreeBSD: formatos binarios (versión archivada)
- Página del manual de elf(5) de FreeBSD
- Preguntas frecuentes sobre NetBSD ELF
- Página del manual de Linux elf(5)
- Guía de bibliotecas y enlazadores de Oracle Solaris
- El proyecto ERESI: ingeniería inversa en sistemas operativos basados en ELF Archivado el 14 de marzo de 2021 en Wayback Machine
- Artículo de Linux Today sobre 86open del 26 de julio de 1999
- Anuncio de 86open en la lista de correo Debian Announce 10 de octubre de 1997, Bruce Perens
- Declaración de Ulrich Drepper (PDF) en el caso The SCO Group vs IBM , 19 de septiembre de 2006
- Discusión sobre 86open y ELF Archivado el 1 de febrero de 2019 en Wayback Machine en Groklaw , 13 de agosto de 2006