Articulo de referencia

Formato ejecutable y enlazable

0x7F 'E' 'L' 'F' "},"developer":{"wt":"[[Unix System Laboratories]] {{rp|3}}"},"type":{"wt":"[[Binary file|Binary]], [[executable]], [[object code|object]], [[Library (computing...

Un archivo ELF tiene dos vistas: el encabezado del programa muestra los segmentos utilizados en tiempo de ejecución, mientras que el encabezado de la sección enumera el conjunto de secciones .

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.
Estructura de un archivo ELF con las entradas clave resaltadas.

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

[ 10 ]

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

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:

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:

PowerPC

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

Referencias

  1. 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)
  2. Formato de archivo de objeto ELF: Apéndice C: Historial de revisiones
  3. Especificación de formatos portátiles del estándar de interfaz de herramientas (TIS), versión 1.1 (octubre de 1993)
  4. Interfaz binaria de aplicación System V, edición 4.1 (18/03/1997)
  5. "Encabezado ELF" . Sco.com. Julio de 2000. Consultado el 7 de febrero de 2014 .
  6. "LXR linux/include/linux/elf.h" . linux.no . Consultado el 27 de abril de 2015 .
  7. "Anunciar glibc 2.12" .
  8. "sourceware.org Git - glibc.git/blob - libc-abis" .
  9. "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 .
  10. "Analizadores léxicos disponibles — Pygments" . pygments.org . Consultado el 19 de diciembre de 2024 .
  11. "Encabezado del programa" . Sco.com. Julio de 2000. Consultado el 5 de abril de 2017 .
  12. "elfutils" . sourceware.org . Consultado el 30 de abril de 2017 .
  13. "Formatos binarios" . Archivado del original el 31/03/2019 . Consultado el 31/03/2019 .
  14. "MinixReleases – Minix Wiki" . Wiki.minix3.org. Archivado del original el 30-03-2013 . Consultado el 19-01-2014 .
  15. "Estado del puerto a x86_64" (PDF) . Archivado del original (PDF) el 15 de septiembre de 2020. Consultado el 19 de octubre de 2016 .
  16. "GCCSDK – RISC OS" . Riscos.info. 22/04/2012. Archivado del original el 19/02/2014 . Consultado el 19/01/2014 .
  17. "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
  18. Foley, Mary Jo. "Bajo el capó del subsistema de Windows para Linux de Microsoft" . ZDNet . Consultado el 19 de agosto de 2016 .
  19. Uso de PlayStation Portable encriptado y reubicado ELF : PSP
  20. Formato de archivo ejecutable del sistema operativo Symbian
  21. 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).
  22. Thomas, Romain. "Formatos de Android" . Quarks Lab . Consultado el 17 de enero de 2023 .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )
  23. "Capítulo 4: Archivos de objeto" , Interfaz binaria de aplicación de System V , 26/10/2009, e_machine
  24. "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).
  25. "Especificaciones referenciadas al LSB" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  26. "Formato ejecutable y de enlace (ELF)" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  27. "Introducción" . linuxfoundation.org . Consultado el 27 de abril de 2015 .
  28. Leibovitch, Evan (1997-12-23). ​​"86Open Preguntas frecuentes" . Archivado del original el 11-03-2007 . Recuperado el 06-06-2007 .
  29. 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 .
  30. Leibovitch, Evan (1999-07-25). "The86open Project – Final Update" . Archivado del original el 27-02-2007 . Recuperado el 06-05-2007 .
  31. Gordon, Ryan. "fatelf-specification v1" . icculus.org . Consultado el 25 de julio de 2010 .
  32. Gordon, Ryan. "FatELF: Resulta que me gustaba más la incertidumbre" . icculus.org . Consultado el 13 de julio de 2010 .
  33. ^ Holwerda, Thom (3 de noviembre de 2009). "Ryan Gordon detiene el proyecto FatELF" . osnews.com . Consultado el 5 de julio de 2010 .
  34. 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)
  • 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
  1. "Enlazadores y cargadores: código de ejemplo" .{{cite web}}: CS1 maint: servicio de archivado obsoleto ( enlace )