Formato ejecutable y enlazable
La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la
versión revisada el 7 de junio de 2021; las comprobaciones requieren
6 ediciones .
ELF ( formato ejecutable y vinculable en inglés - formato de archivo ejecutable y vinculable) es un formato de archivo binario utilizado en muchos sistemas operativos modernos similares a UNIX , como FreeBSD , Linux , Solaris , etc.
Historia
El estándar de formato ELF fue originalmente desarrollado y publicado por como parte de la interfaz de aplicación binaria UNIX System V [1] . Luego fue seleccionado por el comité y desarrollado como un formato portátil para varios sistemas operativos que se ejecutan en la arquitectura de hardware Intel x86 de 32 bits . [2] ELF rápidamente ganó popularidad y, después de que HP expandiera el formato y publicara el estándar ELF-64, se extendió a plataformas de 64 bits. [3]
Tipos
El estándar de formato ELF distingue varios tipos de archivos:
- Archivo reubicable : almacena instrucciones y datos que se pueden vincular a otros archivos de objetos . El resultado de dicho vínculo puede ser un archivo de objeto compartido o un archivo ejecutable. Este tipo incluye archivos de objetos de bibliotecas estáticas.
- Archivo de objeto compartido : también contiene instrucciones y datos y se puede asociar con otros archivos reubicables y archivos de objeto compartido, como resultado de lo cual se creará un nuevo archivo de objeto, o cuando el programa se inicia para su ejecución, el sistema operativo puede asociar dinámicamente con el archivo ejecutable del programa, como resultado se creará una imagen ejecutable del programa. En este último caso, estamos hablando de bibliotecas compartidas.
- Archivo ejecutable : contiene una descripción completa que permite al sistema crear una imagen del proceso . Incluyendo: instrucciones, datos, descripción de los archivos de objetos compartidos requeridos e información simbólica y de depuración necesaria.
Formato
Cada archivo ELF consta de las siguientes partes:
Encabezado de archivo
El encabezado del archivo (ELF Header) tiene una ubicación fija al comienzo del archivo y contiene una descripción general de la estructura del archivo y sus principales características, tales como: tipo, versión del formato, arquitectura del procesador , dirección del punto de entrada virtual , tamaños y compensaciones. de otras partes del archivo. El encabezado es de 52 bytes para archivos de 32 bits o de 64 para archivos de 64 bits . Esta diferencia se debe a que el encabezado del archivo contiene tres campos con un tamaño de puntero, que es de 4 y 8 bytes para procesadores de 32 y 64 bits , respectivamente. Estos campos son e_entry, e_phoffy e_shoff.
Campos de encabezado de archivo ELF
El tamaño
|
Nombre |
Objetivo
|
DUENDE
32
|
DUENDE
64
|
dieciséis
|
e_ident[16] |
Características generales del archivo.
bytes de matrize_ident
Índice
|
Nombre
|
Objetivo
|
0 - 3
|
EI_MAG0-EI_MAG3
|
Firma del archivo: 0x7f 0x45 0x4c 0x46.
|
cuatro
|
EI_CLASS
|
Clase de archivo de objeto.
Nombre
|
Sentido
|
Descripción
|
ELFCLASSNONE
|
0
|
Clase incorrecta
|
ELFCLASS32
|
una
|
archivo de objeto de 32 bits
|
ELFCLASS64
|
2
|
archivo de objeto de 64 bits
|
|
5
|
EI_DATA
|
Método de codificación de datos dependiente del procesador.
|
6
|
EI_VERSION
|
La versión ELF del encabezado. Actualmente, el valor de este byte debería ser EV_CURRENT.
Nombre
|
Sentido
|
EV_CURRENT
|
una
|
|
7
|
EI_OSABI
|
Sistema operativo o extensiones específicas de ABI utilizadas en el archivo. Algunos campos en otras estructuras de archivos ELF tienen banderas y campos cuyo significado depende del sistema operativo o ABI; la interpretación de estos campos está determinada por el valor del byte dado. Si el archivo de objeto no usa extensiones, se recomienda que este byte se establezca en 0. Si el valor de este byte está en el rango de 64a 255, entonces su interpretación depende del valor del campo de encabezado ELF de e_machine. En este rango, cada arquitectura puede definir su propio conjunto de valores.
Nombre
|
Sentido
|
Descripción
|
ELFOSABI_NONE
|
0
|
Sistema UNIX V ABI
|
ELFOSABI_HPUX
|
una
|
HP-UX
|
ELFOSABI_NETBSD
|
2
|
NetBSD
|
ELFOSABI_GNU
|
3
|
El archivo usa extensiones GNU ELF ( GNU/Linux )
|
ELFOSABI_SOLARIS
|
6
|
Solaris
|
ELFOSABI_AIX
|
7
|
AIX
|
ELFOSABI_IRIX
|
ocho
|
IRIX
|
ELFOSABI_FREEBSD
|
9
|
FreeBSD
|
ELFOSABI_TRU64
|
diez
|
Tru64 UNIX
|
ELFOSABI_MODESTO
|
once
|
Modesto
|
ELFOSABI_OPENBSD
|
12
|
OpenBSD
|
ELFOSABI_OPENVMS
|
13
|
openvms
|
ELFOSABI_NSK
|
catorce
|
Núcleo continuo
|
ELFOSABI_AROS
|
quince
|
Sistema operativo de investigación Amiga
|
ELFOSABI_FENIXOS
|
dieciséis
|
fenix OS
|
ELFOSABI_CLOUDABI
|
17
|
NubeABI
|
ELFOSABI_OPENVOS
|
Dieciocho
|
OpenVOS
|
|
64 - 255
|
Valores dependientes del procesador
|
|
ocho
|
EI_ABIVERSION
|
versión ABI.
|
9
|
EI_PAD
|
T. n. bytes de relleno (relleno). Elementos de matriz reservados para uso futuro e_ident. Normalmente se instala en 0. Los lectores de archivos de objetos deben ignorarlos.
|
diez
|
EI_PAD + 1
|
once
|
EI_PAD + 2
|
12
|
EI_PAD + 3
|
13
|
EI_PAD + 4
|
catorce
|
EI_PAD + 5
|
quince
|
EI_PAD + 6
|
|
2
|
e_type |
Tipo de archivo.
|
2
|
e_machine |
La arquitectura de la plataforma de hardware para la que se creó el archivo:
Nombre
|
Sentido
|
Descripción
|
EM_NONE
|
0x0
|
Indefinido
|
EM_M32
|
0x01 |
AT&T WE 32100
|
EM_SPARC
|
0x02 |
SPARC
|
EM_386
|
0x03
|
Intel 80386
|
EM_68K
|
0x04 |
Motorola 68000 (M68k)
|
EM_88K
|
0x05 |
Motorola 88000 (M88k)
|
EM_IAMCU
|
0x06 |
MCU de Intel
|
EM_860
|
0x07 |
Intel 80860
|
EM_MIPS
|
0x08 |
MIPS
|
EM_S370
|
0x09 |
IBM_Sistema/370
|
EM_MIPS_RS3_LE
|
0x0A |
MIPS R3000 Little Endian
|
|
0x0B - 0x0E |
reservado para utilización futura
|
EM_PARISC
|
0x0F |
Hewlett-Packard PA-RISC
|
|
0x10 |
reservado para utilización futura
|
EM_960
|
0x13 |
Intel 80960
|
EM_PPC
|
0x14
|
PowerPC
|
EM_PPC64
|
0x15
|
Power PC (64 bits)
|
EM_S390
|
0x16 |
S390 , incluido S390x
|
EM_SPU
|
0x17 |
IBM SPU/SPC
|
|
0x18 - 0x23 |
reservado para utilización futura
|
EM_V800
|
0x24 |
NEC V800
|
EM_FR20
|
0x25 |
Fujitsu FR20
|
EM_RH32
|
0x26 |
TRW RH-32
|
EM_MCOREyEM_RCE
|
0x27 |
motorola rce
|
EM_ARM
|
0x28 |
ARM (hasta ARMv7/Aarch32)
|
EM_OLD_ALPHA
|
0x29 |
alfa digital
|
EM_SH
|
0x2A |
súper
|
EM_SPARCV9
|
0x2B |
SPARC versión 9
|
EM_TRICORE
|
0x2C |
Procesador integrado Siemens TriCore
|
EM_ARC
|
0x2D |
Núcleo RISC de Argonaut
|
EM_H8_300
|
0x2E |
Hitachi H8/300
|
EM_H8_300H
|
0x2F |
Hitachi H8/300H
|
EM_H8S
|
0x30 |
Hitachi H8S
|
EM_H8_500
|
0x31 |
Hitachi H8/500
|
EM_IA_64
|
0x32 |
IA-64
|
EM_MIPS_X
|
0x33 |
MIPS-X de Stanford
|
EM_COLDFIRE
|
0x34 |
motorola fuego frio
|
EM_68HC12
|
0x35 |
motorola m68hc12
|
EM_MMA
|
0x36 |
Acelerador multimedia Fujitsu MMA
|
EM_PCP
|
0x37 |
Siemens PCP
|
EM_NCPU
|
0x38 |
Procesador RISC integrado nCPU de Sony
|
EM_NDR1
|
0x39 |
Microprocesador Denso NDR1
|
EM_STARCORE
|
0x3A |
Procesador Motorola Star*Core
|
EM_ME16
|
0x3B |
Procesador TOYOTA ME16
|
EM_ST100
|
0x3C |
Procesador STMicroelectronics ST100
|
EM_TINYJ
|
0x3D |
Corporación de Lógica Avanzada. Familia de procesadores integrados TinyJ
|
EM_X86_64
|
0x3E
|
AMD x86-64
|
EM_MCST_ELBRUS
|
0xAF
|
Elbrus (arquitectura del procesador)
|
EM_TI_C6000
|
0x8C |
Familia TMS320C6000
|
EM_AARCH64
|
0xB7 |
ARM de 64 bits (ARMv8/Aarch64)
|
EM_RISCV
|
0xF3 |
RISC-V
|
EM_BPF
|
0xF7 |
Filtro de paquetes de Berkeley
|
EM_65816
|
0x101
|
WDC 65C816
|
|
cuatro
|
e_version |
Número de versión del formato. Por el momento, solo un valor se considera correcto.
Nombre
|
Sentido
|
Descripción
|
EV_NONE
|
0
|
Valor incorrecto
|
EV_CURRENT
|
una
|
Versión actual
|
|
cuatro
|
ocho
|
e_entry |
La dirección virtual del punto de entrada al que el sistema pasa el control cuando se inicia el proceso. Si el archivo no tiene un punto de entrada, este campo contiene 0.
|
cuatro
|
ocho
|
e_phoff |
Desplazamiento de la tabla de encabezado del programa desde el principio del archivo, en bytes. Si el archivo no tiene una tabla de encabezado de programa, este campo contiene 0.
|
cuatro
|
ocho
|
e_shoff |
Desplazamiento de la tabla de encabezado de sección desde el principio del archivo, en bytes. Si el archivo no tiene una tabla de encabezado de sección, este campo contiene 0.
|
cuatro
|
e_flags |
Indicadores específicos del procesador asociados con el archivo . Si están ausentes, este campo contiene 0.
|
2
|
e_ehsize |
Tamaño del encabezado del archivo en bytes ( 52para archivos de 32 y 6464 bits).
|
2
|
e_phentsize |
El tamaño de un encabezado de programa. Todos los encabezados de programa tienen el mismo tamaño ( 32para archivos de 32 bits y 56para archivos de 64 bits).
|
2
|
e_phnum |
El número de encabezados de programa. Si el archivo no tiene una tabla de encabezado de programa, este campo contiene 0.
|
2
|
e_shentsize |
El tamaño de un encabezado de sección. Todos los encabezados de sección tienen el mismo tamaño ( 40para archivos de 32 bits y 64para archivos de 64 bits).
|
2
|
e_shnum |
El número de encabezados de sección. Si el archivo no tiene una tabla de encabezado de sección, este campo contiene 0.
|
2
|
e_shstrndx |
El índice de una entrada en la tabla de encabezado de sección que describe la tabla de nombres de sección (por lo general, esta tabla se llama .shstrtab y representa una sección separada). Si el archivo no contiene una tabla de nombre de sección, este campo contiene 0.
|
Tabla de encabezado del programa
La tabla de encabezados del programa contiene encabezados, cada uno de los cuales describe un segmento de programa separado y sus atributos u otra información que necesita el sistema operativo para preparar el programa para su ejecución. Esta tabla se puede ubicar en cualquier parte del archivo, su ubicación (desplazamiento relativo al comienzo del archivo) se describe en el e_phoffcampo de encabezado ELF.
Al analizar la estructura del encabezado del programa, se pueden encontrar diferentes ubicaciones de campo p_flagspara archivos ELF de 32 y 64 bits. Esta diferencia se debe a la alineación de la estructura para aumentar la eficiencia del procesamiento.
Campos de encabezado de programa
El tamaño
|
Nombre
|
Objetivo
|
DUENDE
32
|
DUENDE
64
|
cuatro
|
p_type
|
El tipo de segmento que describe este encabezado, o cómo interpretar los valores de campo de este encabezado.
Nombre
|
Sentido
|
Descripción
|
PT_NULL
|
0
|
No se utiliza el título, el resto de campos no están definidos. Este tipo le permite incluir elementos ignorados en la tabla de encabezado del programa del archivo.
|
PT_LOAD
|
una
|
El segmento a cargar, descrito por los campos p_fileszy p_memsz. Los bytes del archivo se asignan a un segmento en la memoria. Si el tamaño del segmento de memoria ( p_memsz) es mayor que el tamaño del segmento de archivo ( p_filesz), los bytes adicionales se rellenan con ceros (siguen inmediatamente a los bytes definidos en el segmento). El tamaño de un segmento en un archivo ( p_filesz) no puede ser mayor que el tamaño de un segmento en la memoria ( p_memsz). Los títulos de programas de los segmentos descargables se organizan en la tabla de títulos de programas en orden ascendente del valor del campo p_vaddr.
|
PT_DYNAMIC
|
2
|
El encabezado del programa proporciona información sobre la vinculación dinámica.
|
PT_INTERP
|
3
|
El encabezado del programa proporciona el tamaño y la ubicación de la ruta ( cadenas de estilo C terminadas en nulo) para ejecutar como intérprete. Este tipo de segmento solo es significativo para archivos ejecutables (aunque también puede estar en un archivo de objeto compartido); no puede ocurrir más de una vez en un archivo. Si hay un encabezado de este tipo, debe preceder a cualquier encabezado de programa del segmento que se está cargando.
|
PT_NOTE
|
cuatro
|
El encabezado del programa define la ubicación y el tamaño de la información auxiliar.
|
PT_SHLIB
|
5
|
Este tipo de segmento está reservado, pero su significado no está definido. Los programas que contienen un encabezado de programa de este tipo no cumplen con la ABI.
|
PT_PHDR
|
6
|
El encabezado del programa, si está presente, especifica la ubicación y el tamaño de la tabla de encabezado del programa, tanto en el archivo como en la imagen de la memoria del programa. Este tipo de segmento no puede aparecer más de una vez en un archivo. Además, solo puede ocurrir si hay una tabla de encabezado de programa en el archivo. Si hay un encabezado de este tipo, debe preceder a cualquier encabezado de programa del segmento que se está cargando.
|
PT_TLS
|
7
|
El encabezado del programa define el patrón de almacenamiento local de subprocesos. Los cargadores ELF no deben mantener esta entrada en la tabla de encabezado del programa.
|
PT_LOOS-PT_HIOS
|
1610612736 - 1879048191
|
Valores dependientes del sistema operativo.
|
PT_LOPROC-PT_HIPROC
|
1879048192 - 2147483647
|
Valores dependientes del procesador.
|
|
|
cuatro
|
p_flags
|
Indicadores relacionados con el segmento (para ELF64).
Nombre
|
Sentido
|
Descripción
|
PF_X
|
0x1
|
permiso para ejecutar
|
PF_W
|
0x2
|
permiso de escritura
|
PF_R
|
0x4
|
Permiso de lectura
|
PF_MASKOS
|
0x0ff00000
|
Todos los bits incluidos en este campo definen valores dependientes del sistema operativo.
|
PF_MASKPROC
|
0xf0000000
|
Todos los bits incluidos en este campo definen valores específicos del procesador.
|
|
cuatro
|
ocho
|
p_offset
|
Desplazamiento del segmento desde el principio del archivo.
|
cuatro
|
ocho
|
p_vaddr
|
La dirección virtual del segmento en la memoria donde se debe cargar el segmento cuando se asigna a la memoria.
|
cuatro
|
ocho
|
p_paddr
|
La dirección física del segmento (para sistemas donde es importante).
|
cuatro
|
ocho
|
p_filesz
|
El tamaño del segmento en el archivo. Puede ser nulo.
|
cuatro
|
ocho
|
p_memsz
|
El tamaño del segmento en la memoria. Puede ser nulo.
|
cuatro
|
|
p_flags
|
Banderas relacionadas con el segmento (para ELF32) (ver arriba para los valores posibles).
|
cuatro
|
ocho
|
p_align
|
Alineación de segmentos. 0y 1determinar la falta de alineación. De lo contrario, debe ser un 2 positivo hasta cierto punto.
|
Tabla de encabezado de sección
La tabla de encabezado de sección contiene los atributos de sección del archivo. Esta tabla solo la necesita el enlazador, los archivos ejecutables no necesitan esta tabla (el cargador ELF la ignora). El enlazador utiliza la información proporcionada en la tabla de encabezado de sección para organizar de manera óptima estas secciones en segmentos al compilar el archivo, teniendo en cuenta sus atributos.
Campos de encabezado de sección
El tamaño
|
Nombre
|
Objetivo
|
DUENDE
32
|
DUENDE
64
|
cuatro
|
sh_name
|
Desplazamiento de la línea que contiene el nombre de esta sección, en relación con el comienzo de la tabla de nombres de sección.
|
cuatro
|
sh_type
|
Tipo de encabezado.
Nombre
|
Sentido
|
Descripción
|
SHT_NULL
|
0
|
No se utiliza el título, el resto de campos no están definidos.
|
SHT_PROGBITS
|
una
|
La sección contiene información definida por el programa, su formato y significado están determinados por el programa solo.
|
SHT_SYMTAB
|
2
|
La sección contiene la tabla de símbolos. Solo puede haber una sección de este tipo en un archivo en este momento.
|
SHT_STRTAB
|
3
|
La sección contiene una tabla de cadenas. Un archivo puede tener muchas secciones de este tipo.
|
SHT_RELA
|
cuatro
|
La sección contiene información ampliada sobre los movimientos. Un archivo puede tener muchas secciones de este tipo.
|
SHT_HASH
|
5
|
La sección contiene una tabla hash de símbolos. Solo puede haber una sección de este tipo en un archivo en este momento.
|
SHT_DYNAMIC
|
6
|
La sección contiene información sobre enlaces dinámicos. Solo puede haber una sección de este tipo en un archivo en este momento.
|
SHT_NOTE
|
7
|
La sección contiene información que marca el archivo de alguna manera.
|
SHT_NOBITS
|
ocho
|
La sección no ocupa espacio en el archivo, por lo demás es similar a SHT_PROGBITS.
|
SHT_REL
|
9
|
La sección contiene información sobre los movimientos. Un archivo puede tener muchas secciones de este tipo.
|
SHT_SHLIB
|
diez
|
Este tipo de sección está definido, pero no tiene un significado específico.
|
SHT_DYNSYM
|
once
|
La sección contiene la tabla de símbolos. Solo puede haber una sección de este tipo en un archivo en este momento.
|
SHT_INIT_ARRAY
|
catorce
|
La sección contiene una serie de punteros a las funciones de inicialización del programa. Las funciones no deben aceptar argumentos ni devolver nada.
|
SHT_FINI_ARRAY
|
quince
|
La sección contiene una serie de punteros a las funciones de finalización del programa. Las funciones no deben aceptar argumentos ni devolver nada.
|
SHT_PREINIT_ARRAY
|
dieciséis
|
La sección contiene una matriz de punteros a funciones que se llaman antes de que se llamen las funciones de inicialización del programa. Las funciones no deben aceptar argumentos ni devolver nada.
|
SHT_GROUP
|
17
|
Esta sección define un grupo de secciones. Un grupo de secciones es una colección de secciones relacionadas que el enlazador debe manejar de una manera especial. Dichas secciones solo pueden estar en archivos de objetos reubicables (cuyo campo e_typetiene el valor ET_REL). El encabezado que define un grupo de secciones debe estar en la tabla de secciones antes que los encabezados de todas las secciones incluidas en el grupo que se está definiendo.
|
SHT_SYMTAB_SHNDX
|
Dieciocho
|
Una sección está asociada a una tabla de símbolos y es necesaria si algún elemento de esta tabla hace referencia a un encabezado de sección que tiene un índice SHN_XINDEX(esto sucede si el índice de la sección es tan grande que no cabe en el campo st_shndx). La sección contiene una matriz de números de tipo Elf32_Wordpara ELF32 y Elf64_WordELF64. Cada elemento de esta matriz corresponde a una entrada en la tabla de símbolos y se coloca en el orden correspondiente. Estos elementos son índices de los títulos de sección a los que se asocian los símbolos correspondientes. Si el valor del campo del st_shndxelemento correspondiente de la tabla de símbolos es SHN_XINDEX, el elemento contiene el índice del encabezado de la sección real, de lo contrario, el elemento contiene 0.
|
SHT_LOOS-SHT_HIOS
|
1610612736 - 1879048191
|
Valores dependientes del sistema operativo.
|
SHT_LOPROC-SHT_HIPROC
|
1879048192 - 2147483647
|
Valores dependientes del procesador.
|
SHT_LOUSER-SHT_HIUSER
|
2147483648 - 4294967295
|
Valores dependientes del programa. Estos valores pueden ser utilizados por los controladores de archivos de formato ELF sin conflicto con los valores definidos actualmente.
|
|
cuatro
|
ocho
|
sh_flags
|
atributos de la sección.
Nombre
|
Sentido
|
Descripción
|
SHF_WRITE
|
0x1
|
Permiso de escritura.
|
SHF_ALLOC
|
0x2
|
La sección ocupa memoria mientras se ejecuta el proceso. Algunas secciones de servicio no se cargan en la memoria cuando se carga un archivo de objeto; para dichas secciones, este indicador está deshabilitado.
|
SHF_EXECINSTR
|
0x4
|
La sección contiene instrucciones de máquina ejecutables.
|
SHF_MERGE
|
0x10
|
Los datos en una partición se pueden combinar para eliminar la duplicación. Si la bandera SHF_STRINGSno está configurada, los elementos de datos en la sección tienen el mismo tamaño. El tamaño de un elemento se indica en el campo sh_entsize. Si se establece el indicador SHF_STRINGS, la sección consta de matrices de caracteres terminados en nulo y el tamaño de un carácter se especifica en el campo sh_entsize.
Cada elemento de una sección se compara con otros elementos de secciones con el mismo nombre, tipo y banderas. Se pueden combinar elementos que tendrán el mismo valor durante la ejecución del programa. Las mudanzas que se refieran a miembros de dichas secciones deberán resolverse en consecuencia. Antes de la fusión, se deben analizar todos los elementos de una sección para determinar si los valores serán efectivamente idénticos en tiempo de ejecución.
Esta asociación no es un requisito para el cumplimiento de ABI.
|
SHF_STRINGS
|
0x20
|
Una sección consta de matrices de caracteres terminados en cero. El tamaño de un carácter se especifica en el campo sh_entsize.
|
SHF_INFO_LINK
|
0x40
|
El campo de encabezado de sección sh_infocontiene el índice de la entrada de la tabla de encabezado de sección.
|
SHF_LINK_ORDER
|
0x80
|
Requisitos especiales de ubicación. Los requisitos se aplican si el sh_linkcampo del encabezado de la sección hace referencia a otra sección (sección relacionada). Si el sh_linkcampo de la sección vinculada no contiene 0, la sección actual debe estar en el archivo de salida en el mismo orden relativo a la sección vinculada que la sección vinculada respecto a la sección a la que está vinculada.
|
SHF_OS_NONCONFORMING
|
0x100
|
La sección requiere un manejo especial específico del sistema operativo para evitar el mal comportamiento.
|
SHF_GROUP
|
0x200
|
Sección - un elemento (posiblemente el único) de un grupo de secciones
|
SHF_TLS
|
0x400
|
La sección contiene Almacenamiento local de subprocesos, cada subproceso tendrá su propia copia de esta sección.
|
SHF_COMPRESSED
|
0x800
|
La sección contiene datos comprimidos. Este indicador se aplica solo a las secciones para las que no se asigna memoria al cargar un archivo de objeto en la memoria. La bandera no se usa en combinación con SHF_ALLOC. Esta bandera tampoco se aplica a las secciones de tipo SHT_NOBITS.
Todos los movimientos relacionados con una sección comprimida se refieren a sus datos en estado no comprimido. Por lo tanto, la descompresión de la sección es necesaria para permitir el movimiento. Cada sección comprimida define su propio algoritmo de compresión. Es aceptable que diferentes secciones en un archivo de objeto ELF usen diferentes algoritmos de compresión.
Las secciones comprimidas comienzan con un encabezado que identifica el algoritmo de compresión.
Campos de encabezado de sección comprimidos
El tamaño
|
Nombre
|
Objetivo
|
DUENDE
32
|
DUENDE
64
|
cuatro
|
cuatro
|
ch_type
|
algoritmo de compresión.
Nombre
|
Sentido
|
Descripción
|
ELFCOMPRESS_ZLIB
|
una
|
Los datos de la sección se comprimen mediante el algoritmo Zlib . Los datos comprimidos siguen inmediatamente después del encabezado y antes del final de la sección.
|
ELFCOMPRESS_LOOS-ELFCOMPRESS_HIOS
|
1610612736 - 1879048191
|
Valores dependientes del sistema operativo.
|
ELFCOMPRESS_LOPROC-ELFCOMPRESS_HIPROC
|
1879048192 - 2147483647
|
Valores dependientes del procesador.
|
|
|
cuatro
|
ch_reserved
|
Reservado para utilización futura.
|
cuatro
|
ocho
|
ch_size
|
El tamaño en bytes de la sección descomprimida.
|
cuatro
|
ocho
|
ch_addralign
|
Alineación requerida para la sección descomprimida.
|
|
SHF_MASKOS
|
0x0ff00000
|
Todos los bits incluidos en este campo definen valores dependientes del sistema operativo.
|
SHF_MASKPROC
|
0xf0000000
|
Todos los bits incluidos en este campo definen valores específicos del procesador.
|
|
cuatro
|
ocho
|
sh_addr
|
Si la sección se va a cargar en la memoria cuando se carga el archivo de objeto, este campo especifica la dirección desde la que se cargará la sección; de lo contrario, el campo contiene 0.
|
cuatro
|
ocho
|
sh_offset
|
Desplazamiento de la sección desde el principio del archivo en bytes. Las secciones tipo SHT_NOBITSno ocupan espacio en el archivo, para ellas este campo contiene la ubicación conceptual en el archivo.
|
cuatro
|
ocho
|
sh_size
|
Tamaño de la sección en el archivo. Puede ser nulo.
|
cuatro
|
sh_link
|
El índice de la sección asociada. Este campo puede tener diferentes propósitos según el tipo de encabezado.
Interpretación de campos sh_linky sh_infoen función del valor del camposh_type
sh_type
|
sh_link
|
sh_info
|
SHT_DYNAMIC
|
El índice del encabezado de la sección de la tabla de cadenas que utilizan los elementos de esta sección.
|
0
|
SHT_HASH
|
Índice del encabezado de la sección de la tabla de símbolos a la que pertenece esta tabla hash.
|
0
|
SHT_REL,SHT_RELA
|
El índice de encabezado de sección de la tabla de símbolos asociada.
|
El índice de encabezado de sección al que se aplicarán los datos de reubicación.
|
SHT_SYMTAB,SHT_DYNSYM
|
Índice del encabezado de la sección de la tabla de cadenas asociada.
|
Uno más que el índice del último símbolo local ( STB_LOCAL) en la tabla de símbolos.
|
SHT_GROUP
|
El índice de encabezado de sección de la tabla de símbolos asociada.
|
El índice del elemento en la tabla de símbolos asociada. El nombre del elemento especificado proporciona la firma del grupo de secciones.
|
SHT_SYMTAB_SHNDX
|
El índice del encabezado de la sección de la tabla de símbolos asociada.
|
0
|
|
cuatro
|
sh_info
|
Información adicional sobre la sección (ver arriba para valores posibles).
|
cuatro
|
ocho
|
sh_addralign
|
Alineación de la sección requerida.
|
cuatro
|
ocho
|
sh_entsize
|
El tamaño en bytes de cada entrada (si la sección contiene una matriz de entradas de tamaño fijo; de lo contrario, el campo contiene 0).
|
Contenidos de secciones y segmentos
Utilidades
Hay muchas utilidades para trabajar con archivos ELF, las principales están contenidas en el kit de herramientas de software GNU Binutils :
- elfedit - Cambio de encabezado de archivo ELF, parte de la suite GNU Binutils.
- objdump - información de salida sobre archivos de objetos (incluido ELF), parte del conjunto GNU Binutils.
- readelf - Muestra información detallada sobre un archivo de objeto en formato ELF, parte de la suite GNU Binutils.
- elfdump- mostrar información sobre el archivo ELF, parte de la suite GNU Binutils.
- elfutilses una alternativa para GNU Binutils, oficialmente solo disponible para GNU/Linux , pero existen ports a otros sistemas operativos [4] .
- file- genera una pequeña cantidad de información sobre archivos de formatos conocidos por el programa (disponible para la mayoría de los sistemas operativos similares a UNIX ).
Véase también
Notas
- ↑ Interfaz binaria de la aplicación System V Archivado el 21 de mayo de 2015 en Wayback Machine Edition 4.1 (18 de marzo de 1997 )
- ↑ Especificación ELF Archivado el 16 de junio de 2012 en Wayback Machine .
- ↑ Formato de archivo de objeto ELF-64 Archivado el 1 de julio de 2015 en Wayback Machine .
- ↑ FreshPorts -- desarrollo/elfutils . www.freshports.org. Consultado el 31 de marzo de 2018. Archivado desde el original el 16 de febrero de 2018. (indefinido)
Enlaces