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_PAGED
relacionado 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.h
su 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 objdump
comando.
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,
gdb
por 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.