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
Que onda ens cuando lo intentas? Puedes ver lo que está en un archivo '.o' usando' objdump -x'. –
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 –
@LunarMushrooms Actualizar publicación * ahem * :) –