Estoy usando un programa de prueba para comprender el modelo de memoria C en Linux 6.3 con la versión kernal 2.6.32-279.el6.x86_64.
Primero he compilado debajo del código,
#include <stdio.h> int main(void) { static int i = 100; /* Initialized static variable stored in DS*/ return 0; }al ejecutar el comando de tamaño, llegué a continuación,
[root@rachitjain jan14]# size a.out text data bss dec hex filename 1040 488 16 1544 608 a.outluego, después de eliminar la inicialización de la variable estática 'i', mi código se convierte en,
include <stdio.h> int main(void) { static int i ; return 0; }Al ejecutar el tamaño después de compilar arriba,
[root@rachitjain jan14]# size a.out text data bss dec hex filename 1040 484 24 1548 60c a.outHay un incremento de 8 bytes en la sección bss pero solo se reducen 4 bytes en la sección de datos. ¿Por qué el tamaño es entero al duplicarse mientras se mueve al segmento bss?
He probado este personaje y flotar también, observé el mismo comportamiento.
Mire, la respuesta es que la sección .bss tiene un requisito para estar alineado en 64 bits y el .data no tiene este requisito.
¿Cómo puedes ver esto? Cuando construye su programa, ld usa un script de enlace predeterminado para construir su programa. Puedes verlo si agregas -Wl,-verbose:
g++ main.cpp -Wl,-verboseCuando crea una aplicación de 64 bits, esta es una alineación predeterminada para la sección .bss:
.bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. FIXME: Why do we need it? When there is no .bss section, we don't pad the .data section. */ . = ALIGN(. != 0 ? 64 / 8 : 1); } Como puede ver ALIGN(. != 0 ? 64 / 8 : 1); dice que se alinee a 8 bytes
Cuando crea una aplicación de 32 bits (g++ -m32 main.cpp -Wl,-verbose) esta es una alineación predeterminada para la sección .bss:
.bss : { *(.dynbss) *(.bss .bss.* .gnu.linkonce.b.*) *(COMMON) /* Align here to ensure that the .bss section occupies space up to _end. Align after .bss to ensure correct alignment even if the .bss section disappears because there are no input sections. FIXME: Why do we need it? When there is no .bss section, we don't pad the .data section. */ . = ALIGN(. != 0 ? 32 / 8 : 1); }Su sección .data obviamente no tiene ningún comando ALIGN en el script del enlazador predeterminado:
.data : { *(.data .data.* .gnu.linkonce.d.*) SORT(CONSTRUCTORS) }Enlaces útiles: