When using -fwritable-strings, the compiler emits two copies of the strings. In the supplied example, one of the copies is emitted into a data area that is supposed to contain pointers to the strings. In checking some older versions of gcc, it would appear that this bug first appeared in late May 2003 or early June 2003. Environment: System: Linux fred.ninemoons.com 2.4.20-20.9 #1 Mon Aug 18 11:27:43 EDT 2003 i686 athlon i386 GNU/Linux Architecture: i686 host: i686-pc-linux-gnu build: i686-pc-linux-gnu target: i686-pc-linux-gnu configured with: /src/sourceware/gcc/gcc/configure -v --prefix=/usr/local/sourceware --enable-languages=c,c++ How-To-Repeat: Here is the source code: char *names[] = {"alice", "bob", "john"}; main () { printf ("names[0] = %s\n", names[0]); } This works without -fwritable-strings: $ gcc -o j j.c $ ./j names[0] = alice $ It coredumps with -fwritable-strings: $ gcc -fwritable-strings -o j j.c $ ./j Segmentation fault (core dumped) $ Here is the generated code: .file "j.c" .data .LC0: .string "alice" .LC1: .string "bob" .LC2: .string "john" .globl names .align 4 .type names, @object .size names, 12 names: .LC3: .string "alice" .long .LC3 .LC4: .string "bob" .long .LC4 .LC5: .string "john" .long .LC5 .LC6: .string "names[0] = %s\n" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax subl %eax, %esp movl names, %eax movl %eax, 4(%esp) movl $.LC6, (%esp) call printf leave ret .size main, .-main .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4 20031028 (experimental)" >Fix: Workaround is to not use -fwritable-strings
I can confirm this on the mainline (20031028), I want to say it is related to deferring of writing globals.
We might remove or oboslete -fwritable-strings for 3.4.
Can we remove this option, please or do something with this bug.
Investigating.
Path here: <http://gcc.gnu.org/ml/gcc-patches/2004-01/msg03268.html>.
Subject: Bug 12818 CVSROOT: /cvs/gcc Module name: gcc Changes by: ebotcazou@gcc.gnu.org 2004-01-30 14:16:44 Modified files: gcc : ChangeLog varasm.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.dg: fwritable-strings-1.c Log message: PR c/12818 * varasm.c (const_hash_1) <STRING_CST>: Use the address to compute the hash value if flag_writable_strings. (compare_constant) <STRING_CST>: Compare the addresses if flag_writable_strings. (build_constant_desc): Do not copy the expression for a STRING_CST if flag_writable_strings. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.2561&r2=2.2562 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/varasm.c.diff?cvsroot=gcc&r1=1.405&r2=1.406 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.3442&r2=1.3443 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/fwritable-strings-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1
Subject: Bug 12818 CVSROOT: /cvs/gcc Module name: gcc Branch: gcc-3_4-branch Changes by: ebotcazou@gcc.gnu.org 2004-01-30 14:23:24 Modified files: gcc : ChangeLog varasm.c gcc/testsuite : ChangeLog Added files: gcc/testsuite/gcc.dg: fwritable-strings-1.c Log message: PR c/12818 * varasm.c (const_hash_1) <STRING_CST>: Use the address to compute the hash value if flag_writable_strings. (compare_constant) <STRING_CST>: Compare the addresses if flag_writable_strings. (build_constant_desc): Do not copy the expression for a STRING_CST if flag_writable_strings. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.111&r2=2.2326.2.112 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/varasm.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.405&r2=1.405.2.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.3389.2.32&r2=1.3389.2.33 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/fwritable-strings-1.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=NONE&r2=1.1.2.1
See the aforementioned patch.