Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

257
Vistas
tamaño variable entero en bss y segmento de datos

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.out

luego, 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.out

Hay 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.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

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,-verbose

Cuando 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:

  • http://sourceware.org/ml/binutils/2009-05/msg00174.html
  • http://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Using_ld_the_GNU_Linker/expressions.html )
  • http://lwn.net/Artículos/531148/
  • ALIGN en secuencias de comandos del enlazador
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda