Lo que se ve es la interpretación de la combinación de banderas de segmento ELF, tipo de sección y banderas de sección para cada sección en el archivo objeto.
LOAD
significa que la sección reside en un segmento cargable, es decir, su contenido se puede leer desde el archivo en la memoria cuando se crea un proceso
banderas Sección están bien documentados en la Chapter 4 del Sistema V Application Binary Interface, aunque con nombres ligeramente diferentes de lo que muestra objdump
.
CODE
significa que la sección contiene código ejecutable; se indica por la bandera SHF_EXECINSTR
en el encabezado de sección
DATA
significa que la sección no es ejecutable, pero se puede escribir, indicado por la presencia de la SHF_WRITE
bandera
READONLY
significa que la sección no es ni ejecutable ni writtable y debe ser colocado en las páginas de memoria de solo lectura
ALLOC
significa que la sección ocupa memoria, por ejemplo las páginas de memoria están realmente asignadas para contener el contenido de la sección cuando se crea un proceso, indicado por el indicador SHF_ALLOC
. Algunas secciones, p. aquellos que contienen información de depuración, no se leen en la memoria durante la ejecución normal del programa y no están marcados como ALLOC
para guardar la memoria.
Secciones de tipo SHT_PROGBITS
tienen un contenido correspondiente en el archivo y se muestran como CONTENTS
. Algunas secciones no tienen el contenido correspondiente en el archivo, p. la sección .bss
, que es del tipo SHT_NOBITS
.
La sección .text
contiene el código ejecutable del programa. Se muestra como CONTENTS
ya que es del tipo SHT_PROGBITS
. La memoria debe reservarse para esta sección, ya que es ALLOC
y su contenido debe cargarse desde el archivo, ya que se coloca en un segmento LOAD
-able. El código del programa generalmente no es modificable y, por lo tanto, la sección se coloca en la memoria de solo lectura. Contiene las instrucciones que se deben ejecutar y, por lo tanto, la bandera CODE
.
Inicializadas variables con clase de almacenamiento estático entre en la sección .data
. Sus valores iniciales se almacenan en el archivo y se leen desde allí a medida que se crea el proceso.En C/C++, estas son variables globales, variables locales estáticas y variables de miembros estáticos de C++ que se inicializan apropiadamente, p. static int a = 10;
. Fortran lugares inicializados SAVE
-d variables y COMMON
bloques, que se dan valor inicial con un bloque DATA
declaración allí.
El .bss
sección (nombre histórico, abreviatura de Bloque Iniciado por Símbolo) es el más sencillo. Contiene sin inicializar variables con clase de almacenamiento estático. Es una sección de tipo SHT_NOBITS
y no ocupa espacio en el archivo. La memoria tiene ALLOC
, pero no se lee nada del archivo para rellenar previamente la memoria, solo se conservan todos los ceros proporcionados por el asignador de memoria del kernel.
Constantes suelen ir a la sección de .rodata
(no presente en su ejemplo), que se parece a .data
pero no está marcado como modificable y por lo tanto se muestra como READONLY
.
el enlace # 2 está roto ahora. :( –
Lástima, de hecho. –
Intenté ejecutar objdump -h en un archivo reubicable (archivo .o sin formato, es decir, un archivo sin encabezados de programa), y todavía se enumeran las secciones (por ejemplo, .text) con el atributo LOAD. No está claro para mí cuál es la diferencia entre LOAD y ALLOC. Tal vez solo LOAD = ALLOC && CONTENTS –