2012-06-25 7 views
11

No es esta salida de objdump en algún archivo de objeto:Banderas en la producción objdump del fichero objeto

$ objdump -h main.o 

main.o:  file format elf32-i386 

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .text   0000000b 00000000 00000000 00000034 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
    1 .data   00000000 00000000 00000000 00000040 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
    2 .bss   00000000 00000000 00000000 00000040 2**2 
        ALLOC 
    3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0 
        CONTENTS, READONLY, CODE 

¿Qué tienen estas banderas CONTENIDO, alloc, la carga y así sucesivamente significan?

Respuesta

20

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.

+0

el enlace # 2 está roto ahora. :( –

+0

Lástima, de hecho. –

+0

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 –

4

Se encontraron piezas de información en Ubuntu elf man page y esto es lo que yo entiendo.
Creo que son información tanto de program header y section header.

LOAD: may correspond to PT_LOAD in the Program header table. Brief description: 
It specifies the type of that particular element in the program header table. 
The array element specifies a loadable segment 

ALLOC: may correspond to SHF_ALLOC in the section table. Brief description: 
Its specifies the flag of that particular element in the section header. 
This section occupies memory during process execution. 

CODE/ DATA: indicates the belonging segment 

READONLY: specifies a read-only segment 

CONTENTS: I didn't find anything to conclude. 

Esperanza esto ayuda

Cuestiones relacionadas