Port-evbmips archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Segfaults with latest sources



On Mon, Mar 14, 2016 at 08:53:22PM -0500, John D. Baker wrote:
> > And you said you can't get gdb to work at all, even starting the binary
> > with it? Mips has not switched binutils yet, so that is not the problem.
> 
> Trying to load the core file causes 'gdb' to complain:
> 
>   ".../ftp.core" is not a core dump: File format not recognized

This is a bit tricky to debug currently. Unfortunately a cross gdb
build with MKCROSSGDB=YES has no support for any core files at all - anyone
know how to fix configury to support this? It would be tremendeously
usefull for cases like this!

> Starting program: /usr/bin/ftp 
> /x/nbsd-tst/src/external/gpl3/gdb.old/lib/libgdb/../../dist/gdb/mips-tdep.c:768: internal-error: bad register size

This happens because gdb can deal with debugging 32bit programs with a 64bit
gdb, but not the other way around:

static enum register_status
mips_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
                           int cookednum, gdb_byte *buf)
{
  int rawnum = cookednum % gdbarch_num_regs (gdbarch);
  gdb_assert (cookednum >= gdbarch_num_regs (gdbarch)
              && cookednum < 2 * gdbarch_num_regs (gdbarch));


we get: rawnum = 37, cookednum = 127, gdbarch_num_regs (gdbarch) = 90

Then code tests for 1:1 register sizes:

  if (register_size (gdbarch, rawnum) == register_size (gdbarch, cookednum))
    return regcache_raw_read (regcache, rawnum, buf);

but we have: register_size (gdbarch, rawnum) = 4 and
register_size (gdbarch, cookednum) = 8

Next is code that would deal the other direction:

  else if (register_size (gdbarch, rawnum) >
           register_size (gdbarch, cookednum))
    {

but none for our:
  else
    internal_error (__FILE__, __LINE__, _("bad register size"));


Do we need to extend gdb or compile it as 64bit binary?

Martin


Home | Main Index | Thread Index | Old Index