Subject: Re: i386/ELF stabs
To: None <tech-toolchain@netbsd.org>
From: Charlie Root <root@mail.c-zone.net>
List: tech-toolchain
Date: 07/10/2000 21:10:54
Just over a year ago, Frank van der Linden reported to this list:
> After the recent switch of the i386 port to ELF, people noticed that
> gdb gets linenumbers wrong sometimes. I looked into this, and found
> that it gets them wrong when it has to match a symbol -> linenumber,
> or, to be more precise, PC -> linenumber.
>
> It turns out that it's not actually gdb's fault (I think).
[ ... ]
> There seem to be 2 problems here:
>
> * For the i386, the linenumber information lies outside
> the function information, which can't be correct.
> * The values of the SLINE symbols (which are the matching
> PCs at which this line is located) are supposed to be
> relative to the start of the function. This is correct
> in the sparc binary, but ld(1) has made them absolute
> already on the i386 port, which is wrong.
>
> Looking at the gdb code, it uses the N_FUN stab to get the
> start of the function, and then adds the offset in the N_SLINE
> stab to get the PC. So for the i386, this goes wrong in 2 ways:
> you have not yet encountered N_FUN when you hit the N_SLINE
> stabs, so the offset is wrong, plus the value of N_SLINE is not
> relative as it's supposed to be.
[ ... ]
> Anyone?
I think I've tracked this down in the gcc source tree. Through a long
chain of embedded #includes starting in <config/sparc/netbsdelf.h>,
the Sparc gcc build eventually sees <config/svr4.h>, which has -- hidden
among a lot of other things -- these #defines:
DBX_BLOCKS_FUNCTION_RELATIVE
ASM_OUTPUT_SOURCE_LINE() <-- makes the N_SLINEs relative
DBX_FUNCTION_FIRST
I'm guessing that because the i386 ELF config was derived from the
Alpha config, the i386 gcc build never sees <config/svr4.h>, so it
never gets those #defines.
--Jim Howard <jiho@mail.c-zone.net>