De Wikipedia, la enciclopedia libre
Ir a navegaciónSaltar a buscar
Un archivo ELF tiene dos vistas: el encabezado del programa muestra los segmentos utilizados en tiempo de ejecución, mientras que el encabezado de sección enumera el conjunto de secciones del binario.

En informática , el formato ejecutable y enlazable [ cita requerida ] ( ELF , anteriormente denominado Formato de enlace extensible ), es un formato de archivo estándar común para archivos ejecutables , código de objeto , bibliotecas compartidas y volcados de núcleo . Publicado por primera vez en la especificación para la interfaz binaria de la aplicación (ABI) de la versión del sistema operativo Unix denominada System V Release 4 (SVR4), [2] y posteriormente en Tool Interface Standard, [1]fue rápidamente aceptado entre diferentes proveedores de sistemas Unix . En 1999, el proyecto 86open lo eligió como formato de archivo binario estándar para sistemas Unix y similares a Unix en procesadores x86 .

Por diseño, el formato ELF es flexible, extensible y multiplataforma . Por ejemplo, es compatible con diferentes endianness y tamaños de direcciones, por lo que no excluye ninguna unidad central de procesamiento (CPU) o arquitectura de conjunto de instrucciones en particular . Esto ha permitido que sea adoptado por muchos sistemas operativos diferentes 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 del programa, que describe cero o más segmentos de memoria
  • Tabla de encabezado de sección, que describe cero o más secciones
  • Datos referidos por entradas en la tabla de encabezado del programa o la tabla de encabezado de sección
Estructura de un archivo ELF con entradas clave resaltadas

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 vincular y reubicar. Cualquier byte en todo el archivo puede ser propiedad de una sección como máximo, y pueden aparecer bytes huérfanos que no son propiedad de ninguna sección.

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@.....|

Ejemplo hexdump de encabezado de archivo ELF [3]

Encabezado de archivo

El encabezado ELF define si se deben utilizar direcciones de 32 bits o de 64 bits . El encabezado contiene tres campos que se ven afectados por esta configuración y compensan otros campos que los siguen. El encabezado ELF tiene 52 o 64 bytes de longitud para binarios de 32 y 64 bits, respectivamente.

Encabezado del programa

La tabla de encabezado del programa le dice al sistema cómo crear una imagen de proceso. Se encuentra en el archivo offset e_phoff y consta de entradas e_phnum , cada una con el tamaño e_phentsize . El diseño es ligeramente diferente en ELF de 32 bits frente a ELF de 64 bits , porque 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. Un software libre aplicación es proporcionada por Binutils GNU .
  • 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 objeto. objdumputiliza la biblioteca Binary File Descriptor como back-end para estructurar los datos ELF.
  • La fileutilidad Unix puede mostrar información sobre los archivos ELF, incluida la arquitectura del conjunto de instrucciones para la que 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 similares a Unix

El formato ELF ha reemplazado a los formatos ejecutables más antiguos en varios entornos. Ha reemplazado los formatos a.out y COFF en sistemas operativos similares a Unix:

  • Linux
  • Solaris / Illumos
  • IRIX
  • FreeBSD [11]
  • NetBSD
  • OpenBSD
  • Redox
  • DragonFly BSD
  • Sílaba
  • HP-UX (excepto para programas PA-RISC de 32 bits que continúan usando SOM )
  • QNX Neutrino
  • MINIX [12]

Adopción que no es Unix

ELF también ha tenido cierta adopción en sistemas operativos que no son Unix, como:

  • OpenVMS , en sus versiones Itanium y amd64 [13]
  • BeOS Revision 4 y posterior para computadoras basadas en x86 (donde reemplazó el formato ejecutable portátil ; la versión de PowerPC se mantuvo 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
  • Actualización de aniversario de Windows 10 mediante el subsistema de Windows para Linux . [15] [16]
  • SkyOS
  • SO fucsia
  • Z / TPF
  • SO HPE NonStop [17]
  • Deos

Consolas de juegos

Algunas consolas de juegos también usan ELF:

  • PlayStation Portable , [18] PlayStation Vita , PlayStation (consola) , PlayStation 2 , PlayStation 3 , PlayStation 4 , PlayStation 5
  • GP2X
  • Dreamcast
  • Cubo de juego
  • Wii
  • Wii U

PowerPC

Otros sistemas (operativos) que se ejecutan en PowerPC que usan ELF:

  • AmigaOS 4 , el ejecutable ELF ha reemplazado al formato Extended Hunk (EHF) anterior que se usaba en Amigas equipados con tarjetas de expansión de procesador PPC.
  • MorphOS
  • AROS

Teléfonos móviles

Algunos sistemas operativos para teléfonos móviles y dispositivos móviles utilizan ELF:

  • Symbian OS v9 usa el formato E32Image [19] 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 tienen el parche aplicado).
  • Bada , por ejemplo, el Samsung Wave S8500 .
  • Teléfonos o tabletas Nokia que ejecutan Maemo o Meego OS, por ejemplo, el Nokia N900 .
  • Android usa bibliotecas ELF .so (objeto compartido [20] ) para la interfaz nativa de Java . Con Android Runtime (ART), el valor predeterminado desde Android 5.0 "Lollipop" , todas las aplicaciones se compilan en binarios ELF nativos durante la instalación.

Algunos teléfonos pueden ejecutar archivos ELF mediante el uso de un parche que agrega código de ensamblaje al firmware principal , que es una característica conocida como ELFPack en la cultura de modding clandestina . El formato de archivo ELF también se utiliza 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, sobre todo la implementación de Apple utilizada en casi todas las máquinas PowerPC que produjo la empresa.

Especificaciones

  • Genérico:
    • Interfaz binaria de aplicación System V Edición 4.1 (18-03-1997)
    • Actualización de System V ABI (octubre de 2009)
  • AMD64 :
    • Suplemento de System V ABI, AMD64
  • BRAZO :
    • ELF para la arquitectura ARM
  • IA-32 :
    • System V ABI, suplemento de procesador de arquitectura Intel386
  • IA-64 :
    • Guía de tiempo de ejecución y convenciones del software Itanium (septiembre de 2000)
  • M32R :
    • M32R ELF ABI Supplement Versión 1.2 (2004-08-26)
  • MIPS :
    • Suplemento de procesador System V ABI, MIPS RISC
    • Documentación de MIPS EABI (2003-06-11)
  • Motorola 6800 :
    • ABI integrado de 8 y 16 bits de Motorola
  • PA-RISC :
    • Suplemento ELF para PA-RISC versión 1.43 (6 de octubre de 1997)
  • PowerPC :
    • Sistema V ABI, suplemento PPC
    • Implementación de la interfaz binaria de la aplicación integrada PowerPC de 32 bits (1995-10-01)
    • Suplemento de interfaz binaria de aplicación PowerPC ELF de 64 bits, versión 1.9 (2004)
  • SPARC :
    • Sistema V ABI, suplemento SPARC
  • S / 390 :
    • Suplemento S / 390 32bit ELF ABI
  • zSeries :
    • Suplemento ABI zSeries 64bit ELF
  • Symbian OS 9:
    • Formato de archivo E32Image en Symbian OS 9

El Linux Standard Base (LSB) complementa algunas de las especificaciones anteriores para arquitecturas en las que se especifica. [22] Por ejemplo, ese es el caso del System V ABI, AMD64 Supplement. [23] [24]

86open

86open fue un proyecto para llegar a un consenso sobre un formato de archivo binario común para Unix y sistemas operativos similares a Unix en la arquitectura común x86 compatible con PC , para alentar a los desarrolladores de software a migrar a la arquitectura. [25] La idea inicial era estandarizar en un pequeño subconjunto de Spec 1170, un predecesor de la Especificación Única de UNIX , y la Biblioteca GNU C (glibc) para permitir que los binarios no modificados se ejecuten en los sistemas operativos x86 similares a Unix. El proyecto se denominó originalmente "Spec 150".

El formato finalmente elegido fue ELF, específicamente la implementación de ELF en Linux, después de que resultó ser un estándar de facto respaldado por todos los proveedores y sistemas operativos involucrados.

El grupo inició conversaciones 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 fue Marc Ewing , Dion Johnson, Evan Leibovitch, Bruce Perens , Andrew Roach, Bryan Wayne Sparks y Linus Torvalds . Otras personas 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 admitir oficialmente lxrun para Solaris a principios de 1999, [26] y luego pasó al soporte integrado del formato binario Linux a través de Solaris Containers for Linux Applications .

Dado que los BSD han soportado durante mucho tiempo los binarios de Linux (a través de una capa de compatibilidad ) y los principales proveedores de Unix x86 han añadido soporte para el formato, el proyecto decidió que Linux ELF era el formato elegido por la industria y "declara [d] disuelto" en 25 de julio de 1999. [27]

FatELF: binarios universales para Linux

FatELF es una extensión de formato binario ELF que agrega capacidades binarias gordas . [28] Está dirigido 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 la 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 soportan múltiples versiones de ABI del kernel . A partir del 2 de marzo de 2021 , FatELF no se ha integrado en la línea principal del kernel de Linux. [29] [30] [31]

Ver 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. ^ a b Versión 1.2 de la especificación de formato ejecutable y de enlace (ELF) de Tool Interface Standard (TIS) (mayo de 1995)
  2. ^ Edición 4.1 de la interfaz binaria de la aplicación System V (18-03-1997)
  3. ^ "Lexers disponibles - Pigmentos" . pygments.org .
  4. ^ "Encabezado ELF" . Sco.com. Julio de 2000 . Consultado el 7 de febrero de 2014 .
  5. ^ "LXR linux / include / linux / elf.h" . linux.no . Consultado el 27 de abril de 2015 .
  6. ^ "glibc 2.12 anuncia" .
  7. ^ "sourceware.org Git - glibc.git / blob - libc-abis" .
  8. ^ "sourceware.org Git - glibc.git / blob - sysdeps / gnu / ldsodefs.h" .
  9. ^ "Encabezado del programa" . Sco.com. Julio de 2000 . Consultado el 5 de abril de 2017 .
  10. ^ "elfutils" . sourceware.org . Consultado el 30 de abril de 2017 .
  11. ^ "Formatos binarios" .
  12. ^ "MinixReleases - Minix Wiki" . Wiki.minix3.org. Archivado desde el original el 30 de marzo de 2013 . Consultado el 19 de enero de 2014 .
  13. ^ https://vmssoftware.com/pdfs/State_of_Port_20160906.pdf
  14. ^ "GCCSDK - RISC OS" . Riscos.info. 2012-04-22 . Consultado el 19 de enero de 2014 .
  15. ^ "Anuncio de Windows 10 Insider Preview Build 14316" . Blog de experiencia de Windows . 2016-04-06 . Consultado el 10 de abril de 2016 .
  16. ^ Foley, Mary Jo. "Bajo el capó del subsistema de Windows de Microsoft para Linux | ZDNet" . ZDNet . Consultado el 19 de agosto de 2016 .
  17. ^ "Guía del programador de guardián" (PDF) . Hewlett Packard Enterprise. Archivado desde el original (PDF) el 30 de mayo de 2018 . Consultado el 30 de mayo de 2018 . pag. 44 archivado desde el original el 30 de mayo de 2018
  18. ^ Uso de PlayStation Portable ELF cifrado y reubicado: PSP
  19. ^ Formato de archivo ejecutable del sistema operativo Symbian
  20. ^ Rosen, Kenneth; Anfitrión, Douglas; Klee, Rachel; Rosinski, Richard (2007). UNIX: The Complete Reference (2 ed.). Profesional de McGraw Hill. pag. 707. ISBN 9780071706988. Consultado el 8 de junio de 2017 . Las bibliotecas vinculadas dinámicamente también se denominan objetos compartidos (.so).
  21. ^ "Capítulo 4: Archivos de objeto" , Interfaz binaria de aplicación de System V , 26 de octubre de 2009, e_machine
  22. ^ "Especificaciones de referencia LSB" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  23. ^ "Formato ejecutable y de vinculación (ELF)" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  24. ^ "Introducción" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  25. Leibovitch, Evan (23 de diciembre de 1997). "86Preguntas frecuentes sobre Open" . Archivado desde el original el 11 de marzo de 2007 . Consultado el 6 de junio de 2007 .
  26. Record, Ronald (21 de mayo de 1998). "Boletín sobre el estado de 86open en SCO" . Archivado desde el original el 8 de diciembre de 2008 . Consultado el 6 de mayo de 2008 .
  27. Leibovitch, Evan (25 de julio de 1999). "Proyecto The86open - Actualización final" . Archivado desde el original el 27 de febrero de 2007 . Consultado el 6 de mayo de 2007 .
  28. ^ Gordon, Ryan. "especificación de fatelf v1" . icculus.org . Consultado el 25 de julio de 2010 .
  29. ^ Gordon, Ryan. "FatELF: Resulta que me gustó más la incertidumbre" . icculus.org . Consultado el 13 de julio de 2010 .
  30. Holwerda, Thom (3 de noviembre de 2009). "Ryan Gordon detiene el proyecto FatELF" . osnews.com . Consultado el 5 de julio de 2010 .
  31. ^ Brockmeier, Joe (23 de junio de 2010). "YO: Anatomía de una (supuesta) falla" . Noticias semanales de Linux . Consultado el 6 de febrero de 2011 .

Lectura adicional

  • Levine, John R. (2000) [octubre de 1999]. Enlazadores y cargadores . La Serie Morgan Kaufmann en Ingeniería de Software y Programación (1 ed.). San Francisco, Estados Unidos: 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] Errata: [3]
  • Drepper, Ulrich (20 de agosto de 2006). "Cómo escribir bibliotecas compartidas" (PDF) . 4.0 . Consultado el 20 de junio de 2007 . Cite journal requiere |journal=( ayuda )
  • Un héroe olvidado: The hardworking ELF 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 disección por Eric Youngdale (1995-05-01)
  • Un tutorial vertiginoso sobre la creación de ejecutables ELF realmente teensy para Linux por Brian Raiter
  • Reubicación de ELF en objetos no reubicables por Julien Vanegue (2003-08-13)
  • Depuración de ELF incorporada sin ptrace por el equipo de ELFsh (2005-08-01)
  • Estudio de carga ELF y relocs por Pat Beirne (1999-08-03)

Enlaces externos

  • Manual de FreeBSD: formatos binarios (versión archivada)
  • FreeBSD elf (5) página de manual
  • Preguntas frecuentes sobre NetBSD ELF
  • Página de manual de Linux elf (5)
  • Guía de bibliotecas y vinculadores de Oracle Solaris
  • El proyecto ERESI: ingeniería inversa en sistemas operativos basados ​​en ELF
  • Artículo de Linux Today sobre 86open 26 de julio de 1999
  • Anuncio de 86open en la lista de correo de Debian Announce 10 de octubre de 1997, Bruce Perens
  • Declaración de Ulrich Drepper (PDF) en The SCO Group vs IBM , 19 de septiembre de 2006
  • 86 Discusión abierta y ELF sobre Groklaw , 13 de agosto de 2006