const int i; -fno-zero-initialized-in-bss -> .bss = FAIL const int i; -fzero-initialized-in-bss -> .bss const int i = 0; -fno-zero-initialized-in-bss -> .rodata const int i = 0; -fzero-initialized-in-bss -> .rodata = FAIL const int i = 1; -fno-zero-initialized-in-bss -> .rodata const int i = 1; -fzero-initialized-in-bss -> .rodata gcc (GCC) 4.6.0 20100627 (experimental) (gcc-4.4+ behaves the same) -fzero-initialized-in-bss is the default now. (a) Creating .robss would solve it all but OK, there isn't any. (b) At least -O0 -g should default to -fno-zero-initialized-in-bss as it better catches bugs of modified const zeroed variables.
const int i; -fno-zero-initialized-in-bss -> .bss = FAIL You need -fno-common also to get it out of the BSS.
>const int i = 0; -fzero-initialized-in-bss -> .rodata = FAIL This is correct because it should really be in readonly data section as it is constant.
(In reply to comment #1) > const int i; -fno-zero-initialized-in-bss -> .bss = FAIL > You need -fno-common also to get it out of the BSS. -fno-common now at least correctly reports: echo 'const int i;'|gcc -fno-common -c -o k.o -x c -;echo 'const int i;main(){}'|gcc -fno-common -c -o l.o -x c -;gcc -fno-common -o k k.o l.o l.o:(.bss+0x0): multiple definition of `i' k.o:(.bss+0x0): first defined here So it is no longer SHN_COMMON, thanks. But reopening the Bug as it is still in .bss, not in .rodata. echo 'const int i;int main(){return *(int *)&i = 0;}'|gcc -fno-common -Wall -o 1 -x c -;./1;echo $? 0 [25] .bss NOBITS 0000000000600818 00000814 0000000000000018 0000000000000000 WA 0 0 8 Num: Value Size Type Bind Vis Ndx Name 55: 0000000000600828 4 OBJECT GLOBAL DEFAULT 25 i It should SEGV but it does not. -f{,no-}zero-initialized-in-bss has no effect on it.
Fixed by r8-2857-g2ec399d8a6c9c26 (there was a few followups patches which fix problems with this patch too).