Kompilator może umieścić taką zmienną w bss
, a także w data
. Na przykład, GCC ma special option kontroli takiego zachowania:
-fno-zero-initialized-in-bss
Jeśli cel wspiera sekcję BSS, GCC domyślnie umieszcza zmienne, które są inicjowane na zero w BSS. Ten może zaoszczędzić miejsce w wynikowym kodzie. Ta opcja wyłącza to zachowanie , ponieważ niektóre programy jawnie polegają na zmiennych przechodzących do sekcji danych. Np., Aby wynikowy plik wykonywalny mógł znaleźć początek tej sekcji i/lub dokonać w oparciu o to założeń. Domyślne ustawienie to -fzero-initialized-in-bss
.
Próbowałem z poniższym przykładzie (test.c
pliku):
int put_me_somewhere = 0;
int main(int argc, char* argv[]) { return 0; }
Kompilacja bez opcji (domyślnie -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
kompilacji z -fno-zero-initialized-in-bss
opcji:
$ 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
Co się stało ens, kiedy go wypróbujesz? Możesz zobaczyć, co znajduje się w pliku '.o', używając' objdump -x'. –
Próbowałem poniżej A). Dla int globalvar = 0; objdump -x test> 1.txt B) .for ==> int globalvar; objdump -x testu> 2.txt A diff: - 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 Update post * ahem * :) –