http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47966

           Summary: GCC 3.4.6 and 4.4.3 generate wrong stabs debugging
                    information for global variables explicitly
                    initialized with 0.
           Product: gcc
           Version: 4.4.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: joni...@gmail.com


extern int printf (const char *, ...);

static int var1;
static int var2 = 0;
static int var3 = 1;

int
main(int argc, char *argv[])
{
        printf("v1=%d v2=%d v3=%d\n", var1, var2, var3);

        return 0;
}

Old compiler 2.95.2 was putting var1 in .bss section and both var2 and var3 in
.data section. 

GCC 3.4.6 is smarter and puts var2 in .bss section, but seems forgot to update
generation of debugging information. For var2 it generates:
  .stabs "var2:S1",38,0,4,_var2
where 38=0x26=N_STSYM - data segment variable. It have to be 40=0x28=N_LCSYM.

objdump confirms wrong debbugging info.

0804a020 l     O .bss    00000004              var1
0804a024 l     O .bss    00000004              var2
0804a014 l     O .data    00000004              var3 
27     LCSYM  0      0      0804a020 719    var1:S(0,1)
28     STSYM  0      0      0804a024 731    var2:S(0,1)    # BUG: Must be LCSYM
29     STSYM  0      0      0804a014 743    var3:S(0,1) 

When I use gcc with -S switch to generate .s assembler file and then manually
fix the .stab from 38 to 40 to say that it is in .bss section then everything
works fine in our GDB 6.8 (proprietary FreeBSD based system).

I've also verified on Ubuntu 10.04 gcc 4.4.3-4ubuntu5 that this bug is still
present. I had no chance to verify anything newer than 4.4.3


Seems that GDB 6.8 for ELF format is smart enough and does ignore the wrong
address that debug symbols provide. 

On our platform for A.OUT format files the GDB 6.8 is confused by wrong
debugging information and tries to get variable information from some bogus
address in .data section. We will have to patch our GDB to trust the symbol
table more than debugging information. Ideally GCC also will be changed.

Reply via email to