Il compilatore è libero di inserire tale variabile in bss
e data
. Ad esempio, GCC ha un controllo di tale comportamento special option:
-fno-zero-initialized-in-bss
Se l'obiettivo supporta una sezione BSS, GCC per default mette le variabili che vengono inizializzate a zero in BSS. Questo può risparmiare spazio nel codice risultante. Questa opzione disattiva il comportamento poiché alcuni programmi si basano esplicitamente su variabili che vanno a nella sezione dati. Ad esempio, in modo che l'eseguibile risultante possa trovare l'inizio di quella sezione e/o fare ipotesi basate su quello.
Il valore predefinito è -fzero-initialized-in-bss
.
provato con il seguente esempio (test.c
file):
int put_me_somewhere = 0;
int main(int argc, char* argv[]) { return 0; }
compilazione senza opzioni (implicitamente -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
compilazione con -fno-zero-initialized-in-bss
opzione:
$ 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
fonte
2012-01-04 03:19:25
Che cosa felice ens quando lo provi? Puoi vedere cosa c'è in un file '.o' usando' objdump -x'. –
Ho provato sotto A) .for int globalvar = 0; objdump -x test> 1.txt B) .for ==> int globalvar; objdump -x test> 2.txt E il diff è: - 2 .bss 00000004 00000000 00000000 00000058 2 ** 2 + 2 .bss 00000000 00000000 00000000 00000058 2 ** 2 -00.000.000 g O.bss 00000004 globalvar +00000004 O * COM * 00000004 globalvar –
@LunarMushrooms Post di aggiornamento * ahem * :) –