[gnu.gcc.bug] Problems debugging gcc compiled code.

howie@cunixc.cc.columbia.edu (Howie Kaye) (09/18/89)

I have a piece of code which works exactly correctly when compiled
under gcc, however, when run under gdb (or dbx), the value of a static
variable "x" is always shown wrong (see source below).  Checking
further, I find that the address gdb is looking at for "x" is wrong
(nm shows its address to be 0x1030, while gdb show it to be 0xfe4).
The assembly code produced by gcc appears to be correct.  Gdb does
debug this correctly when using the standard ultrix (bsd) C compiler.

I am using gcc version 1.35.
Debuggers which i have tried out with this are: 
	gdb version 3.2 
	gdb version 2.7
	dbx version 4.0

This is all running on a Vax 8700, running Ultrix version 2.0

attached are:
1) C source,
2) gcc -S output,
3) cc -S output (for comparison purposes)
4) nm output
5) script of compilation and gdb run.
------------------------------------------------------------
Howie Kaye				howie@columbia.edu
Columbia University 			hlkcu@cuvma.bitnet
Systems Group				...!rutgers!columbia!howie
------------------------------------------------------------
xxx.c:
---------

main() {
    int z=5;

    foo(&z);
}

foo(y) 
int *y;
{
    static int x=10;

    *y = x = 2;
    x = 9;
    printf("%d %d\n", x, *y); 
}


-----------------
xxx.s: (from gcc)
-----------------
#NO_APP
gcc_compiled.:
.text
	.align 1
.globl _main
_main:
	.word 0x0
	subl2 $4,sp
	movl $5,-4(fp)
	subl3 $4,fp,r0
	pushl r0
	calls $1,_foo
	ret
.data
	.align 2
_x.0:
	.long 10
.text
	.align 0
LC0:
	.ascii "%d %d\12\0"
	.align 1
.globl _foo
_foo:
	.word 0x0
	movl $2,_x.0
	movl $2,*4(ap)
	movl $9,_x.0
	pushl *4(ap)
	pushl _x.0
	pushab LC0
	calls $3,_printf
	ret

---------------
xxx.s (from cc)
---------------
LL0:
	.data
	.text
	.align	2
	.globl	_main
_main:
	.word	L12
	jbr 	L14
L15:
	movl	$5,-4(fp)
	subl3	$4,fp,r0
	pushl	r0
	calls	$1,_foo
	ret
	.set	L12,0x0
L14:
	subl2	$4,sp
	jbr 	L15
	.data
	.text
	.align	2
	.globl	_foo
_foo:
	.word	L17
	jbr 	L19
L20:
	.data
	.align	2
L21:
	.long	10
	.text
	movl	$2,L21
	movl	L21,r0
	movl	r0,*4(ap)
	.data	1
L23:
	.ascii	"%d %d\12\0"
	.text
	pushl	*4(ap)
	pushl	L21
	pushl	$L23
	calls	$3,_printf
	ret
	.set	L17,0x0
L19:
	jbr 	L20
	.data

------------
nm output
------------
% nm xxx
00000098 t -lg
00000ac0 T __cleanup
00001170 B __dbargs
00000098 T __dbsubc
000000a3 T __dbsubn
000001cc T __doprnt
00000f5c T __exit
0000095c T __flsbuf
00000a5c T __fwalk
00000bbc T __getstdiobuf
00001088 D __iob
00001370 B __iob_end
000010c4 D __iob_start
00000ea4 T _bcopy
00000bb4 T _close
000013e8 B _end
00001004 D _environ
00001374 B _errno
00000f48 T _exit
00000f5c t _exit.o
00000b44 T _fclose
00000ad0 T _fflush
0000006a T _foo
00000d5c T _free
00000c1c T _fstat
00000c44 T _gtty
00000c64 T _ioctl
00000c24 T _isatty
0000004c T _main
00000c6c T _malloc
00000044 T _moncontrol
000000a4 T _printf
00000d90 T _realloc
00001140 D _realloc_srchlen
00000f08 T _sbrk
00000f40 T _write
00001030 d _x.0					******************
00000ea4 t bcopy.o
00000f60 T cerror
00000f60 t cerror.o
00000bac t close.o
00000000 t crt0.o
0000116c D curbrk
00000a5c t data.o
000000cc t doprnt.o
00000f48 t exit.o
00000ad0 t fclose.o
0000095c t flsbuf.o
00000c14 t fstat.o
0000004c t gcc_compiled.
00000bbc t getstdiobuf.o
00000c44 t gtty.o
00000c5c t ioctl.o
00000c24 t isatty.o
00000c6c t malloc.o
00001008 D mcount
00001168 D minbrk
000000a4 t printf.o
00000f08 t sbrk.o
00000000 T start
00000f38 t write.o
0000004c t xxx.o
------------


Script started on Sun Sep 17 22:28:11 1989
% gcc -v -g -o xxx xxx.c
gcc version 1.35
 /usr/local/lib/gcc-cpp -v -undef -D__GNUC__ -Dvax -Dunix -D__vax__ -D__unix__ xxx.c /tmp/cc005675.cpp
GNU CPP version 1.35
 /usr/local/lib/gcc-cc1 /tmp/cc005675.cpp -quiet -dumpbase xxx.c -g -version -o /tmp/cc005675.s
GNU C version 1.35 (vax) compiled by GNU C version 1.35.
 as -o xxx.o /tmp/cc005675.s
 ld -o xxx /lib/crt0.o xxx.o /usr/local/lib/gcc-gnulib -lg -lc

% gdb xxx
GDB 3.2, Copyright (C) 1988 Free Software Foundation, Inc.
There is ABSOLUTELY NO WARRANTY for GDB; type "info warranty" for details.
GDB is free software and you are welcome to distribute copies of it
 under certain conditions; type "info copying" to see the conditions.
Reading symbol data from /sy/howie/tmp/xxx...done.
Type "help" for a list of commands.
(gdb) b main
Reading in symbols for xxx.c...done.
Breakpoint 1 at 0x51: file xxx.c, line 2.
(gdb) r
Starting program: /sy/howie/tmp/xxx 

Bpt 1, main (1, 2147474988, 2147474996) (xxx.c line 2)
2	    int z=5;
(gdb) step
4	    foo(&z);
(gdb) print z
$1 = 5
(gdb) step
foo (y=(int *) 0x7fffde00) (xxx.c line 12)
12	    *y = x = 2;
(gdb) print x
$2 = 0
(gdb) print &x
$1 = (int *) 0xfe4
(gdb) print *y
$3 = 5
(gdb) step
13	    x = 9;
(gdb) print *y
$4 = 2
(gdb) print x
$5 = 0
(gdb) step
14	    printf("%d %d\n", x, *y); 
(gdb) print x
$6 = 0
(gdb) step
9 2
15	}
(gdb) c
Continuing.

Program exited normally.
(gdb) quit
% exit
% 
script done on Sun Sep 17 22:29:26 1989

----------