Se sabe que la sección .bss no se almacenó en el disco, pero la sección .bss en la memoria se debe inicializar a cero. pero, ¿dónde debería llevar en la memoria? ¿Hay alguna información que se muestra en el encabezado ELF o la sección ¿Es probable que la sección .bss aparezca junto a la sección de datos, o algo más?¿dónde debería tomarse en memoria la sección .bss del archivo ELF?
Respuesta
saber dónde está el segmento bss estará en la memoria, es suficiente para ejecutar readelf -S program
, y comprobar el Addr columna en la fila .bss
.
En la mayoría de los casos, también verá que la sección de datos inicializados (.data
) viene inmediatamente antes. Es decir, verá que Addr + Tamaño de la sección .data
coincide con la dirección inicial de la sección .bss
.
Sin embargo, ese no siempre es el caso. Estas son convenciones históricas, y el ELF specification (para ser leído junto con el suplemento específico de la plataforma, por ejemplo el Capítulo 5 en el que cubre 32-bit x86 machines) permite configuraciones mucho más sofisticadas, y no todas son compatibles con Linux. Por ejemplo, la sección no se puede llamar .bss
. Las únicas 2 propiedades que hacen que una sección BSS tales son:
- La sección está marcada con
SHT_NOBITS
(es decir, que se necesita espacio en la memoria, pero ninguno en el almacenamiento) que se muestra comoNOBITS
en salidareadelf
's. - Se asigna a un segmento cargable (
PT_LOAD
), legible (PF_R
) y grabable (PF_W
). Tal segmento también es más corto en almacenamiento que en la memoria (p_filesz
<p_memsz
).
Puede tener varias secciones del SRS: PowerPC ejecutables pueden tener .sbss
y .sbss2
de variables de datos sin inicializar.
Finalmente, la sección BSS no es necesariamente adyacente a la sección de datos o al montón. Si marca el Linux kernel (más en particular la función load_elf_binary
), puede ver que las secciones BSS (o más precisamente, el segment al que se asigna) pueden incluso estar intercaladas con código y datos inicializados. El kernel de Linux logra resolver eso.
El BSS está entre los datos y el montón, como se detalla en this marvelous article.
Puede averiguar el tamaño de cada sección usando size
:
[email protected]:~$ size try
text data bss dec hex filename
1108 496 16 1620 654 try
- 1. ¿qué parte del archivo ELF debe cargarse en la memoria?
- 2. ¿Las variables inicializadas cero de la sección .bss ocupan espacio en el archivo elf?
- 3. Agregar sección al archivo ELF
- 4. x86 ASM Linux - Usando la Sección .bss
- 5. ¿Cuál es la ventaja de tener una sección .bss?
- 6. archivo ELF a mano
- 7. BSS, Pila, Pila, Datos, Código/Texto - ¿Dónde cada uno de estos comienza en la memoria?
- 8. Formato de archivo de núcleo ELF
- 9. Herramienta para modificar la sección dinámica de un binario ELF
- 10. Sección Flush ELF de la RAM después de la inicialización de la biblioteca
- 11. ¿Cómo se extrae solo el contenido de una sección ELF
- 12. cabecera ELF lectura en C
- 13. ¿Herramienta para la modificación simple del archivo elf?
- 14. Embalaje de un archivo en un archivo ejecutable ELF
- 15. ¿Cómo puedo examinar el contenido de una sección de datos de un archivo ELF en Linux?
- 16. obteniendo el miembro sh_name en un archivo elf de cabecera de sección
- 17. Leer la entrada GOT en Elf Binary
- 18. ¿Por qué la nomenclatura de la sección de memoria tiene el prefijo '.'
- 19. Tabla de cadenas en ELF
- 20. ¿Dónde debería colocar scriptmanager
- 21. .gitignore archivo, ¿dónde debería ponerlo en mi proyecto xcode?
- 22. Cómo cargar un archivo ejecutable ELF ejecutable dinámicamente?
- 23. ¿Cómo son los diferentes segmentos como montón, pila, texto relacionado con la memoria física?
- 24. ¿Cómo sé de dónde necesita la sección .data obtener los datos init? (linker de gcc)
- 25. a.out reemplazado por formato de archivo ELF?
- 26. ¿Dónde debería poner la clase base vacía?
- 27. Acceso a la tabla de símbolos ELF en C
- 28. glibc: archivo elf OS ABI no válido
- 29. ¿Dónde debería descargar CorFlags.exe?
- 30. ¿Dónde se almacena la memoria en vtable?
sip +1 para ese artículo u publicado de hecho uno excelente – abhi
+1 ¿Todavía estás en el abuelo de 32 bits? – JeremyP
Esperando que todo el bombo de 64 bits termine :-)) – cnicutar