2012-05-02 15 views
8

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

10

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:

  1. 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 como NOBITS en salida readelf 's.
  2. 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.

14

El BSS está entre los datos y el montón, como se detalla en this marvelous article.

enter image description here

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 
+0

sip +1 para ese artículo u publicado de hecho uno excelente – abhi

+0

+1 ¿Todavía estás en el abuelo de 32 bits? – JeremyP

+0

Esperando que todo el bombo de 64 bits termine :-)) – cnicutar

Cuestiones relacionadas