
En informática , el formato ejecutable y enlazable [ 3 ] ( ELF , anteriormente llamado formato de enlace extensible ) es un formato de archivo estándar común para archivos ejecutables , código objeto , bibliotecas compartidas , controladores de dispositivos y volcados de memoria . Publicado por primera vez en la especificación de la interfaz binaria de aplicación (ABI) de la versión del sistema operativo Unix denominada System V Release 4 (SVR4) [ 4 ] , y posteriormente en el Tool Interface Standard [ 1 ] , fue rápidamente aceptado entre diferentes proveedores de sistemas Unix . En 1999, fue elegido como el formato de archivo binario estándar para sistemas Unix y similares a Unix en procesadores x86 por el proyecto 86open .
El formato ELF, por diseño, es flexible, extensible y multiplataforma . Por ejemplo, admite diferentes orden 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 su adopción por numerosos sistemas operativos en diversas plataformas de hardware .
Diseño de archivo
Cada archivo ELF se compone de una cabecera ELF, seguida de los datos del archivo. Los datos pueden incluir:
- Tabla de encabezado del programa, que describe cero o más segmentos de memoria.
- Tabla de encabezados de sección, que describe cero o más secciones.
- Datos a los que se refieren las entradas en la tabla de encabezado del programa o en la tabla de encabezado de sección.

Los segmentos contienen información necesaria para la ejecución del archivo, mientras que las secciones contienen datos importantes para la vinculación y la reubicación. Cada byte del archivo completo puede pertenecer a una sola sección como máximo, y pueden existir bytes huérfanos que no pertenecen a ninguna sección.
Encabezado ELF
La cabecera ELF define si se deben usar direcciones de 32 o 64 bits . La cabecera contiene tres campos que se ven afectados por esta configuración y que desplazan a los campos siguientes. La cabecera ELF tiene una longitud de 52 o 64 bytes para binarios de 32 y 64 bits, respectivamente.
Ejemplo de volcado hexadecimal
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 | .ELF............ | 00000010 02 00 3e 00 01 00 00 00 c5 48 40 00 00 00 00 00 | ..>......H@..... |Encabezado del programa
La tabla de encabezado del programa le indica al sistema cómo crear una imagen de proceso. Se encuentra en el desplazamiento de archivo e_phoff y consta de e_phnum entradas, cada una con un tamaño de e_phentsize . La disposición es ligeramente diferente en ELF de 32 bits frente a ELF de 64 bits , porque los p_flags se encuentran 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 proporciona una implementación de software libre .elfutilsProporciona herramientas alternativas a GNU Binutils exclusivamente para Linux. [ 12 ]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
fileutilidad de Unix puede mostrar información sobre los archivos ELF, incluida la arquitectura del conjunto de instrucciones para la que está destinado el código de un archivo reubicable, ejecutable o de objeto compartido, o en el que se produjo un volcado de memoria ELF.
Aplicaciones
Sistemas tipo Unix
El formato ELF ha reemplazado a formatos ejecutables más antiguos en diversos entornos. Ha sustituido a los formatos a.out y COFF en sistemas operativos tipo Unix :
Adopción de sistemas no Unix
ELF también ha sido adoptado en algunos sistemas operativos que no son Unix, como por ejemplo:
- OpenVMS , en sus versiones Itanium y amd64 [ 15 ]
- BeOS Revisión 4 y posteriores para computadoras basadas en x86 (donde reemplazó el formato Portable Executable ; la versión PowerPC mantuvo el formato Preferred Executable Format ).
- Haiku , una reimplementación de código abierto de BeOS.
- RISC OS [ 16 ]
- Stratus VOS , en versiones PA-RISC y x86
- SkyOS
- Fucsia OS
- Z/TPF
- Sistema operativo HPE NonStop [ 17 ]
- Dios
Microsoft Windows también utiliza el formato ELF, pero solo para su sistema de compatibilidad Windows Subsystem for Linux . [ 18 ]
consolas de videojuegos
Algunas consolas de videojuegos también utilizan ELF:
- PlayStation Portable , [ 19 ] PlayStation Vita , PlayStation , PlayStation 2, PlayStation 3, PlayStation 4, PlayStation 5
- GP2X
- Dreamcast
- GameCube
- Nintendo 64
- Wii
- Wii U
PowerPC
Otros sistemas (operativos) que se ejecutan en PowerPC y que utilizan ELF:
- En AmigaOS 4 , el ejecutable ELF ha sustituido al formato Extended Hunk Format (EHF) anterior, que se utilizaba en los Amiga equipados con tarjetas de expansión de procesador PPC.
- MorphOS
- AROS
- Café OS (El sistema operativo que utiliza 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 [ 20 ] 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 [ 21 ] ) para la interfaz nativa de Java . Con Android Runtime (ART), el predeterminado desde Android 5.0 "Lollipop", todas las aplicaciones se compilan en binarios ELF nativos durante la instalación. [ 22 ] También es posible utilizar software nativo de Linux desde gestores de paquetes como Termux, o compilarlos desde el código fuente mediante Clang o GCC, que están disponibles en repositorios.
Algunos teléfonos pueden ejecutar archivos ELF mediante un parche que añade código ensamblador al firmware principal, una función conocida como ELFPack en la comunidad de modificación de dispositivos. El formato de archivo ELF también se utiliza con las arquitecturas de microcontroladores Atmel AVR (8 bits), AVR32 [ 23 ] y Texas Instruments MSP430. Algunas implementaciones de Open Firmware también pueden cargar archivos ELF, especialmente la implementación de Apple, presente en casi todos los equipos PowerPC fabricados por la compañía.
Plataformas blockchain
- Solana utiliza el formato ELF para sus programas en cadena ( contratos inteligentes ). La plataforma procesa archivos ELF compilados a código de bytes BPF (Berkeley Packet Filter), que luego se implementan como objetos compartidos y se ejecutan en el entorno de ejecución de Solana. El cargador BPF valida y procesa estos archivos ELF durante la implementación del programa. [ 24 ]
Presupuesto
La Linux Standard Base (LSB) complementa algunas de las especificaciones anteriores para las arquitecturas en las que se especifica. [ 25 ] Por ejemplo, ese es el caso de la ABI System V, suplemento AMD64. [ 26 ] [ 27 ]
86 abierto
86open fue un proyecto para lograr un consenso sobre un formato de archivo binario común para sistemas operativos Unix y similares a Unix en la arquitectura x86 compatible con PC, con el fin de alentar a los desarrolladores de software a portar sus programas a dicha arquitectura. [ 28 ] La idea inicial era estandarizar un pequeño subconjunto de la Especificación 1170, un predecesor de la Especificación Única de UNIX, y la Biblioteca C de GNU (glibc) para permitir que los binarios sin modificar se ejecutaran en los sistemas operativos x86 similares a Unix. El proyecto fue designado originalmente como "Especificación 150".
El formato finalmente elegido fue ELF, concretamente la implementación de ELF en Linux, después de que se convirtiera en un estándar de facto compatible con todos los proveedores y sistemas operativos implicados.
El grupo comenzó a intercambiar correos electrónicos en 1997 y se reunió por primera vez en las oficinas de Operaciones de Santa Cruz el 22 de agosto de 1997.
El comité directivo estaba formado por Marc Ewing, Dion Johnson, Evan Leibovitch, Bruce Perens , Andrew Roach, Bryan Wayne Sparks y Linus Torvalds. Otros participantes 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 avanzó 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 brindar soporte oficial a lxrun para Solaris a principios de 1999, [ 29 ] y posteriormente integró el soporte del formato binario de Linux mediante Solaris Containers for Linux Applications.
Dado que los sistemas BSD llevaban tiempo soportando binarios de Linux (a través de una capa de compatibilidad) y los principales proveedores de Unix x86 habían añadido 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. [ 30 ]
FatELF: binarios universales para Linux
FatELF es una extensión del formato binario ELF que agrega capacidades de binarios fat . [ 31 ] Está dirigido a Linux y otros sistemas operativos tipo 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 núcleo principal de Linux. [ 32 ] [ 33 ] [ 34 ]
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
- 1 2 Especificación del formato ejecutable y de enlace (ELF) del estándar de interfaz de herramientas (TIS) Versión 1.2 (mayo de 1995)
- ↑ Formato de archivo de objeto ELF: Apéndice C: Historial de revisiones
- ↑ 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/03/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 .
- ↑ "Anunciar glibc 2.12" .
- ↑ "sourceware.org Git - glibc.git/blob - libc-abis" .
- ↑ "sourceware.org Git - glibc.git/blob - sysdeps/gnu/ldsodefs.h" . Archivado del original el 7 de marzo de 2021. Consultado el 28 de octubre de 2019 .
- ↑ "Analizadores léxicos disponibles — Pygments" . pygments.org . Consultado el 19 de diciembre de 2024 .
- ↑ "Encabezado del 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 del original el 31/03/2019 . Consultado el 31/03/2019 .
- ↑ "MinixReleases – Minix Wiki" . Wiki.minix3.org. Archivado del original el 30-03-2013 . Consultado el 19-01-2014 .
- ↑ "Estado del puerto a x86_64" (PDF) . Archivado del original (PDF) el 15 de septiembre de 2020. Consultado el 19 de octubre de 2016 .
- ↑ "GCCSDK – RISC OS" . Riscos.info. 22/04/2012. Archivado del original el 19/02/2014 . Consultado el 19/01/2014 .
- ↑ "Guía del programador de Guardian" (PDF) . Hewlett Packard Enterprise. Archivado del original (PDF) el 30 de mayo de 2018. Consultado el 30 de mayo de 2018 .pág. 44 archivado del original Archivado el 30-05-2018 en Wayback Machine el 30-05-2018
- ↑ Foley, Mary Jo. "Bajo el capó del subsistema de Windows para Linux de Microsoft" . ZDNet . Consultado el 19 de agosto de 2016 .
- ↑ Uso de PlayStation Portable encriptado y reubicado ELF : PSP
- ↑ Formato de archivo ejecutable del sistema operativo Symbian
- ↑ Rosen, Kenneth; Host, Douglas; Klee, Rachel; Rosinski, Richard (2007). UNIX: The Complete Reference (2.ª ed.). McGraw Hill Professional. pág. 707. ISBN 9780071706988. Consultado el 08/06/2017 .
Las bibliotecas vinculadas dinámicamente también se denominan objetos compartidos (.so).
- ↑ Thomas, Romain. "Formatos de Android" . Quarks Lab . Consultado el 17 de enero de 2023 .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace ) - ↑ "Capítulo 4: Archivos de objeto" , Interfaz binaria de aplicación de System V , 26/10/2009, e_machine
- ↑ "Programas Solana" . Fundación Solana. 11 de noviembre de 2024. Consultado el 11 de noviembre de 2024. Solana
aprovecha la infraestructura del compilador LLVM para compilar programas en archivos de formato ejecutable y enlazable (ELF).
- ↑ "Especificaciones referenciadas al 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 (1997-12-23). "86Open Preguntas frecuentes" . Archivado del original el 11-03-2007 . Recuperado el 06-06-2007 .
- ↑ Record, Ronald (1998-05-21). "Boletín sobre el estado de 86open en SCO" . Archivado del original el 8 de diciembre de 2008. Recuperado el 6 de mayo de 2008 .
- ↑ Leibovitch, Evan (1999-07-25). "The86open Project – Final Update" . Archivado del original el 27-02-2007 . Recuperado el 06-05-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 . Recuperado el 6 de febrero de 2011 .
Lecturas adicionales
- Evolución del formato de archivo de objeto ELF , por Fangrui Song.
- Levine, John R. (2000) [octubre de 1999]. Enlazadores y cargadores . Serie Morgan Kaufmann de ingeniería de software y programación (1.ª ed.). San Francisco, EE. UU.: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . Consultado el 12 de enero de 2020 .
{{cite book}}: CS1 maint: servicio de archivado obsoleto ( enlace ) Código: [ 1 ]Errata: - Ulrich Drepper , Cómo escribir bibliotecas compartidas, 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 incansable ELF, por Peter Seebach, 20 de diciembre de 2005, archivado del original el 24 de febrero de 2007.
- LibElf y GElf: una biblioteca para manipular archivos ELf en la 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 de Eric Youngdale (1 de mayo de 1995)
- Tutorial relámpago sobre cómo crear ejecutables ELF realmente diminutos 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 embebido sin ptrace por el equipo de ELFsh (01/08/2005)
- Estudio de la carga y reubicación de ELF realizado por Pat Beirne (3 de agosto de 1999)
Enlaces externos
- Especificación del formato de archivo de objeto ELF
- Formato de archivo de objeto ELF en GitHub
- Interfaz binaria de la aplicación System V y definición de la interfaz
- Manual de FreeBSD: Formatos binarios (versión archivada)
- Página del manual de FreeBSD elf(5)
- Preguntas frecuentes sobre NetBSD ELF
- Página del manual de Linux elf(5)
- Guía de Oracle Solaris Linker y Bibliotecas
- 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 en 86open Archivado el 8 de marzo de 2021 en Wayback Machine 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 SCO Group vs IBM , 19 de septiembre de 2006
- 86open y debate sobre ELF en Groklaw , 13 de agosto de 2006
- ↑ "Enlazadores y cargadores: código de ejemplo" .
{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
- Formatos de archivos ejecutables