2012-01-04 16 views
20

Todas las variables globales/estáticas inicializados irán a sección de datos inicializado. Todas las variables globales/estáticas sin inicializar irán a sección de datos uninitialed (BSS). Las variables en BSS obtendrán un valor 0 durante el tiempo de carga del programa.Si una variable global se inicializa en 0, ¿irá a BSS?

Si una variable global es inicializado explícitamente a cero (int myglobal = 0), donde se almacenará esa variable?

+4

Que onda ens cuando lo intentas? Puedes ver lo que está en un archivo '.o' usando' objdump -x'. –

+0

Intenté debajo de A) .for int globalvar = 0; objdump -x test> 1.txt B) .for ==> int globalvar; objdump -x test> 2.txt Y el diff es: - 2 .bss 00000004 00000000 00000000 00000058 2 ** 2 + 2 .bss 00000000 00000000 00000000 00000058 2 ** 2 -00000000 g O.bss 00000004 globalvar +00000004 O * COM * 00000004 globalvar –

+0

@LunarMushrooms Actualizar publicación * ahem * :) –

Respuesta

26

compilador es libre de poner dicha variable en bss, así como en data. Por ejemplo, GCC tiene una special option controlar tal comportamiento:

-fno-zero-initialized-in-bss

Si el objetivo es compatible con una sección BSS, GCC por defecto pone las variables que se inicializan a cero en BSS. Este puede ahorrar espacio en el código resultante. Esta opción desactiva este comportamiento debido a que algunos programas se basan explícitamente en las variables que van a la sección de datos. Por ejemplo, para que el ejecutable resultante pueda encontrar el al comienzo de esa sección y/o hacer suposiciones basadas en eso.

El valor predeterminado es -fzero-initialized-in-bss.

intentado con el siguiente ejemplo (test.c archivo):

int put_me_somewhere = 0; 

int main(int argc, char* argv[]) { return 0; } 

Compilar sin opciones (implícitamente -fzero-initialized-in-bss):

$ touch test.c && make test && objdump -x test | grep put_me_somewhere 
cc  test.c -o test 
0000000000601028 g  O .bss 0000000000000004    put_me_somewhere 

compilar con -fno-zero-initialized-in-bss opción:

$ touch test.c && make test CFLAGS=-fno-zero-initialized-in-bss && objdump -x test | grep put_me_somewhere 
cc -fno-zero-initialized-in-bss test.c -o test 
0000000000601018 g  O .data 0000000000000004    put_me_somewhere 
+1

reputación interesante, usted tiene. –

+1

@EknathIyer Lo rompí :( –

+0

dayummm, lástima, Eldar –

6

Es bastante fácil para la prueba de un compilador específico:

$ cat bss.c 
int global_no_value; 
int global_initialized = 0; 

int main(int argc, char* argv[]) { 
    return 0; 
} 
$ make bss 
cc  bss.c -o bss 
$ readelf -s bss | grep global_ 
    32: 0000000000400420  0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux 
    40: 0000000000400570  0 FUNC LOCAL DEFAULT 13 __do_global_ctors_aux 
    55: 0000000000601028  4 OBJECT GLOBAL DEFAULT 25 global_initialized 
    60: 000000000060102c  4 OBJECT GLOBAL DEFAULT 25 global_no_value 

Estamos buscando la ubicación de 0000000000601028 y 000000000060102c:

$ readelf -S bss 
There are 30 section headers, starting at offset 0x1170: 

Section Headers: 
    [Nr] Name    Type    Address   Offset 
     Size    EntSize   Flags Link Info Align 
... 
    [24] .data    PROGBITS   0000000000601008 00001008 
     0000000000000010 0000000000000000 WA  0  0  8 
    [25] .bss    NOBITS   0000000000601018 00001018 
     0000000000000018 0000000000000000 WA  0  0  8 

Parece que ambos valores se almacenan en la .bss sección en mi sistema: gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4).

1

El comportamiento depende de la aplicación C. Se puede terminar en cualquier .data o .bss, y para aumentar los cambios que no terminan en .data tomando el espacio redundante para arriba, es mejor no para inicializar explícitamente a 0, ya que se pone a 0 todos modos, si el el objeto es de duración estática.

+0

Esta pregunta está etiquetada como GCC (aunque la versión/objetivo no está especificada). –

Cuestiones relacionadas