[gnu.gcc.bug] gcc 1.35/386-sysv sdb bugs

james@bigtex.cactus.org (James Van Artsdalen) (06/05/89)

There appears to be a bug in the way that gcc outputs sdb debugging
information.  In addition, there may also be a bug in the way gdb
3.1.2 reads the COFF symbol table.  This is i386-sysv gcc & gdb,
without GNU as.

Here's the source file:
-----
struct syment
{
	union
	{
		char		_n_name[8];	/* old COFF version */
		struct
		{
			long	_n_zeroes;	/* new == 0 */
			long	_n_offset;	/* offset into string table */
		} _n_n;
		char		*_n_nptr[2];	/* allows for overlaying */
	} _n;
	long			n_value;	/* value of symbol */
	short			n_scnum;	/* section number */
	unsigned short		n_type;		/* type and derived type */
	char			n_sclass;	/* storage class */
	char			n_numaux;	/* number of aux. entries */
};

struct syment a;

main()
{
}
-----
Here's a short session with that source, using both cc and gcc.

/usr/local/src/binutils> gcc -g a.c -o a
/usr/local/src/binutils> gdb -q a
Reading symbol data from /usr/local/src/binutils/a...done.
(gdb) whatis a
type = struct syment  {
    union  {<no data fields>
    } _n;
    int n_value;
    short n_scnum;
    unsigned short n_type;
    char n_sclass;
    char n_numaux;
}
(gdb) q
/usr/local/src/binutils> cc -g a.c -o a
/usr/local/src/binutils> gdb -q a
Reading symbol data from /usr/local/src/binutils/a...done.
(gdb) whatis a
type = struct syment  {
    union .1fake _n;
    int n_value;
    short n_scnum;
    unsigned short n_type;
    char n_sclass;
    char n_numaux;
}

Here's the .s output from cc:
-----
	.file	"a.c"
	.version	"02.01"
	.data
	.text
	.def	.0fake;	.scl	10;	.type	010;	.size	8;	.endef
	.def	_n_zeroes;	.val	0;	.scl	8;	.type	04;	.endef
	.def	_n_offset;	.val	4;	.scl	8;	.type	04;	.endef
	.def	.eos;	.val	8;	.scl	102;	.tag	.0fake;	.size	8;	.endef
	.data
	.text
	.def	.1fake;	.scl	12;	.type	011;	.size	8;	.endef
	.def	_n_name;	.val	0;	.scl	11;	.type	062;	.dim	8;	.size	8;	.endef
	.def	_n_n;	.val	0;	.scl	11;	.type	010;	.tag	.0fake;	.size	8;	.endef
	.def	_n_nptr;	.val	0;	.scl	11;	.type	0162;	.dim	2;	.size	8;	.endef
	.def	.eos;	.val	8;	.scl	102;	.tag	.1fake;	.size	8;	.endef
	.data
	.text
	.def	syment;	.scl	10;	.type	010;	.size	20;	.endef
	.def	_n;	.val	0;	.scl	8;	.type	011;	.tag	.1fake;	.size	8;	.endef
	.def	n_value;	.val	8;	.scl	8;	.type	04;	.endef
	.def	n_scnum;	.val	12;	.scl	8;	.type	03;	.endef
	.def	n_type;	.val	14;	.scl	8;	.type	015;	.endef
	.def	n_sclass;	.val	16;	.scl	8;	.type	02;	.endef
	.def	n_numaux;	.val	17;	.scl	8;	.type	02;	.endef
	.def	.eos;	.val	20;	.scl	102;	.tag	syment;	.size	20;	.endef
	.data
	.def	a;	.val	a;	.scl	2;	.type	010;	.tag	syment;	.size	20;	.endef
	.comm	a,20
	.text
	.align	4
	.def	main;	.val	main;	.scl	2;	.type	044;	.endef
	.globl	main
main:
	jmp	.L15
.L14:
	.ln	1
	.def	.bf;	.val	.;	.scl	101;	.line	23;	.endef
/REGAL	0	NODBL
.L13:
	.def	.ef;	.val	.;	.scl	101;	.line	2;	.endef
	.ln	2
	leave
	ret
.L15:
	pushl	%ebp
	movl	%esp,%ebp
	jmp	.L14
	.def	main;	.val	.;	.scl	-1;	.endef
	.data
-----
Here's the .s output from gcc:
-----
	.file	"a.c"
gcc_compiled.:
.text
	.def	syment;	.scl	10;	.type	010;	.size	20;	.endef
	.def	_n;	.val	0;	.scl	8;	.size	8;	.type	011;	.endef
	.def	n_value;	.val	8;	.scl	8;	.type	04;	.endef
	.def	n_scnum;	.val	12;	.scl	8;	.type	03;	.endef
	.def	n_type;	.val	14;	.scl	8;	.type	015;	.endef
	.def	n_sclass;	.val	16;	.scl	8;	.type	02;	.endef
	.def	n_numaux;	.val	17;	.scl	8;	.type	02;	.endef
	.def	.eos;	.val	20;	.scl	102;	.tag	syment;	.size	20;	.endef
	.align 4
	.def	.0fake;	.scl	12;	.type	011;	.size	8;	.endef
	.def	_n_name;	.val	0;	.scl	11;	.dim	8;	.size	8;	.type	062;	.endef
	.def	_n_n;	.val	0;	.scl	11;	.size	8;	.type	010;	.endef
	.def	_n_nptr;	.val	0;	.scl	11;	.dim	2;	.size	8;	.type	0162;	.endef
	.def	.eos;	.val	8;	.scl	102;	.tag	.0fake;	.size	8;	.endef
	.def	.1fake;	.scl	10;	.type	010;	.size	8;	.endef
	.def	_n_zeroes;	.val	0;	.scl	8;	.type	04;	.endef
	.def	_n_offset;	.val	4;	.scl	8;	.type	04;	.endef
	.def	.eos;	.val	8;	.scl	102;	.tag	.1fake;	.size	8;	.endef
	.def	main;	.val	main;	.scl	2;	.type	044;	.endef
.globl main
main:
	.ln	1
	pushl %ebp
	movl %esp,%ebp
	.def	.bf;	.val	.;	.scl	101;	.line	23;	.endef
	.ln	2
.L1:
	.def	.ef;	.val	.;	.scl	101;	.line	2;	.endef
	leave
	ret
	.def	main;	.val	.;	.scl	-1;	.endef
	.def	a;	.val	a;	.scl	2;	.tag	syment;	.size	20;	.type	010;	.endef
.comm a,20
-----
"printsyms" for the cc compiled version yields

Symtab for file _globals_

Line table:


Blockvector:

block #000 (object 0x40bdf0) [0x0..0x11c]
 int environ; static at 0x40035c,
 struct syment  {
     union .1fake _n;
     int n_value;
     short n_scnum;
     unsigned short n_type;
     char n_sclass;
     char n_numaux;
 } a; static at 0x40078c,
 int _ctype; static at 0x400360,
 int errno; static at 0x400588,
 int __dbargs; static at 0x40058c,
  block #001 (object 0x40bdd8) [0x0..0x11c] (under 0x40bdf0)


Symtab for file ctype.c

Line table:


Blockvector:

block #000 (object 0x40bd28) [0x128..0x1f0]
  block #001 (object 0x40bd0c) [0x128..0x1f0] (under 0x40bd28)
   int first_call; static at 0x400564,


Symtab for file a.c

Line table:

 line 23 at 11e
 line 24 at 11e

Blockvector:

block #000 (object 0x40bcc0) [0x11c..0x128]
 int main(); block (object 0x40bc84) starting at 0x11c,
  block #001 (object 0x40bc9c) [0x11c..0x128] (under 0x40bcc0)
   struct .0fake  {
       int _n_zeroes;
       int _n_offset;
   };

   union .1fake  {
       char _n_name[8];
       struct .0fake _n_n;
       char *_n_nptr[2];
   };

   struct syment  {
       union .1fake _n;
       int n_value;
       short n_scnum;
       unsigned short n_type;
       char n_sclass;
       char n_numaux;
   };

    block #002 (object 0x40bc84) [0x11c..0x125] (under 0x40bc9c) main


"printsyms" for the gcc compiled version yields


Blockvector:

block #000 (object 0x40bd68) [0x11c..0x124]
 int main(); block (object 0x40bd2c) starting at 0x11c,
  block #001 (object 0x40bd44) [0x11c..0x124] (under 0x40bd68)
   struct syment  {
       union  {<no data fields>
       } _n;
       int n_value;
       short n_scnum;
       unsigned short n_type;
       char n_sclass;
       char n_numaux;
   };

   union .0fake  {
       char _n_name[8];
       struct  {<no data fields>
       } _n_n;
       char *_n_nptr[2];
   };

   struct .1fake  {
       int _n_zeroes;
       int _n_offset;
   };

    block #002 (object 0x40bd2c) [0x11c..0x121] (under 0x40bd44) main


-- 
James R. Van Artsdalen          james@bigtex.cactus.org   "Live Free or Die"
Dell Computer Co    9505 Arboretum Blvd Austin TX 78759         512-338-8789