Partes del archivo Encabezado

Partes del archivo Encabezado

Estaba trabajando en mis programas en C, soy nuevo en el desarrollo de Linux/UNIX y estaba echando un vistazo.

Creé un programa C simple de Hola mundo y estaba inspeccionando el proceso de compilación.

Intenté leer el encabezado del archivo del ejecutable final y obtuve el resultado como este

$ objdump -f my_output
file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x08048320**

Entiendo la parte elf32-i386 pero no estoy muy seguro con las otras partes del encabezado.

¿Está D_PAGEDrelacionado de alguna manera con la paginación de demanda? y que significa EXEC_P, HAS_SYSMS? ¿Es la dirección de inicio, la dirección lógica del main()programa?

Respuesta1

Las banderas en la salida sonBFD: descriptores de archivos binarios. Son parte del paquete binutils, puede leer lo que significan las banderas si busca /usr/include/bfd.hsu significado en el archivo de encabezado bfd oaquí.

La referencia a las "banderas"0x00000112es lo que se llama uncampo de bandera. Es binario y cada bit representa una característica particular, un uno significa que la bandera está encendida o configurada y un cero significa que no lo está. También tenga en cuenta que "0x..." significa que es un valor hexadecimal, por lo que si lo convierte de HEX a BIN:

0x00000112 = 0001 0001 0010 en binario.

Entonces se configuran las banderas que corresponden a los bits 2, 5 y 9 en el campo de bandera. Esas son las banderas que se muestran por nombre en la tercera línea de salida del objdumpcomando.

Significado de las banderas

Las 3 banderas que tiene su ejecutable son bastante estándar. ¡Lea los bits de derecha a izquierda!

1er bit - 0000 0000 0010

  /* BFD is directly executable.  */
#define EXEC_P         0x02

2do bit - 0000 0001 0000

  /* BFD has symbols.  */
#define HAS_SYMS       0x10

3er bit - 0001 0000 0000

  /* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the
     linker sets this by default, but clears it for -r or -n or -N).  */
#define D_PAGED        0x100

Entonces las conclusiones:

  • Este es un archivo ejecutable
  • Incluye una tabla de símbolos si desea depurarlo usando Gnu Debugger, gdbpor lo que las funciones tendrán nombres significativos.
  • el ejecutable está vinculado dinámicamente a las bibliotecas estándar como glibc, etc.

Dirección de inicio

La última línea, dirección de inicio..., es como lo habrás adivinado, donde comienza el .CODE real para el ejecutable.

información relacionada