stringtranslate.com

Formato ejecutable y enlazable

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 .

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:

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

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 :

Adopción de sistemas no Unix

ELF también ha sido adoptado en sistemas operativos no Unix, como:

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:

PC de potencia

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

Teléfonos móviles

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

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

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]

Véase también

Referencias

  1. ^ Especificación del formato ejecutable y de enlace (ELF) del estándar de interfaz de herramientas (TIS), versión 1.2 (mayo de 1995)
  2. ^ Especificación de formatos portátiles del estándar de interfaz de herramientas (TIS), versión 1.1 (octubre de 1993)
  3. ^ Interfaz binaria de aplicación System V , edición 4.1 (18 de marzo de 1997)
  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. ^ "Anuncio de glibc 2.12".
  7. ^ "sourceware.org Git - glibc.git/blob - libc-abis".
  8. ^ "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 .
  9. ^ "Encabezado de 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". Archivado desde el original el 2019-03-31 . Consultado el 2019-03-31 .
  12. ^ "MinixReleases – Minix Wiki". Wiki.minix3.org. Archivado desde el original el 2013-03-30 . Consultado el 2014-01-19 .
  13. ^ "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 )
  14. ^ "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 .
  15. ^ "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
  16. ^ Foley, Mary Jo. "Bajo el capó del subsistema Windows de Microsoft para Linux". ZDNet . Consultado el 19 de agosto de 2016 .
  17. ^ PlayStation Portable utiliza ELF cifrado y reubicado: PSP
  18. ^ Formato de archivo ejecutable del sistema operativo Symbian
  19. ^ 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).
  20. ^ Thomas, Romain. «Formatos Android». Quarks Lab . Archivado desde el original el 16 de febrero de 2023. Consultado el 17 de enero de 2023 .
  21. ^ "Capítulo 4: Archivos de objetos", Interfaz binaria de aplicación de System V , 26 de octubre de 2009, e_machine
  22. ^ "Especificaciones referenciadas de LSB". linuxfoundation.org . Consultado el 27 de abril de 2015 .
  23. ^ "Formato ejecutable y de enlace (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). «86Open Frequently-Asked Questions». 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 la 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). «The86open Project – Final Update». Archivado desde el original el 27 de febrero de 2007. Consultado el 6 de mayo de 2007 .
  28. ^ Gordon, Ryan. "fatelf-specification v1". icculus.org . Consultado el 25 de julio de 2010 .
  29. ^ Gordon, Ryan. "FatELF: Resulta que me gustaba 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). "SELF: Anatomía de un (supuesto) fracaso". Linux Weekly News . Consultado el 6 de febrero de 2011 .

Lectura adicional

Enlaces externos