Re: Mystified by "Internal error: pc 0x89f21e10 read in psymtab, but not in symtab

Earl Chew
2002-09-15T15:43:37Z

Daniel Jacobowitz wrote:
> With any patches? And, did you check which of .mdebug/.stab you're
> getting?

Some patches for VxWorks compatibility, and yes, it's using .stabs.

>>>This sounds like your GCC and binutils are out of sync, in fact.
>>
>>I'm pretty sure there's something wrong with gdb in this regard
>>because end_symtab is being called with cstk->start_addr
>>(succesfully relocated) and end_addr (not relocated).
>
>
> One difference between stabs-in-mdebug and stabs-in-elf is whether line
> and other addresses are relative to the beginning of the function or
> absolute. A mismatch causes this symptom. If you're getting
> stabs-in-ELF, I believe GCC 2.95 is not prepared for that.

Daniel, I can now see why you are suspicious about my previous attempt
at a fix. Thinking about the problem some more, I see that if my
attempted patch were really the proper fix, this problem should manifest
itself in all sites running gdb --- and clearly it doesn't.

So I must be on the right track, but clearly, the patch isn't resolving
the core of the problem.

I'm running gdb like this:

vxgdb> file c:/foo.dbg
vxgdb> target remote 10.0.0.2:987

A consequence of the target command is that the remote is queried for
qOffsets, and responds with the relocated addresses for .text, .data
and .bss.

The result of this is that objfile_relocate in objfiles.c is called
to relocate the symbols. I can see this walking the partial symbols
using ALL_OBJFILE_PSYMTABS.

However, dbxread.c has private symbol information cached in
read_symtab_private. The contents of this information is unknown
to objfile_relocate, and hence it doesn't make any attempt to
relocate it. I think the solution here is to provide another
function pointer (eg relocate_symtab) to allow objfile_relocate
to get this private information updated.

So, I think objfiles.c needs to be changed to:

{
struct partial_symtab *p;

ALL_OBJFILE_PSYMTABS (objfile, p)
{
p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));

p->relocate_symtab(p, delta);
}
}

And the implementation for dbxread.c should be:

static void dbx_relocate_symtab(
struct partial_symtab* pst,
struct section_offsets* delta)
{
TEXTLOW(pst) += ANOFFSET (delta, SECT_OFF_TEXT (pst->objfile));
TEXTHIGH(pst) += ANOFFSET (delta, SECT_OFF_TEXT (pst->objfile));
}

Corresponding implementations are required in dwarf2read.c, hpread.c,
mdebugread.c, os9kread.c and xcoffread.c. Some of these do not
cache offsets the way dbxread.c does, so the relocation function
can be empty.

Earl