Re: GDB 7.4 adds shlib_events BPs, casuing problem in debugging vmlinux

Joakim Tjernlund
2012-05-30T14:26:39Z

Joakim Tjernlund/Transmode wrote on 2012/05/30 15:47:56:
>
> Using above gdb I get this when trying to debug a kernel with a BDI2000 emulator:
> #> powerpc-softfloat_4.5.3-linux-gnu-gdb vmlinux
> GNU gdb (Gentoo 7.4 p1) 7.4
> Copyright (C) 2012 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> This is free software: you are free to change and redistribute it.
> There is NO WARRANTY, to the extent permitted by law. Type "show copying"
> and "show warranty" for details.
> This GDB was configured as "--host=i686-pc-linux-gnu --target=powerpc-softfloat_4.5.3-linux-gnu".
> For bug reporting instructions, please see:
> <http://bugs.gentoo.org/>...
> Reading symbols from /usr/local/src/kenth_os2kernel.git/vmlinux...done.
> (gdb) tar remote bdi:2001
> Remote debugging using bdi:2001
> 0xeff80050 in ?? ()
> (gdb) mon reset
> (gdb) cont
> Continuing.
> Warning:
> Cannot insert breakpoint -1.
> Error accessing memory address 0xc0000000: Unknown error 4294967295.
>
> This ia because gdb always inserts a special BP:
>
> (gdb) maintenance info breakpoints
> Num Type Disp Enb Address What
> -1 shlib events keep y 0xc0000000 <_stext> inf 1
>
> I cannot get rid of this shared lib BP.
> Also linux does not use shard libs so why is it inserted in the fist place?
> Is there some tweak I can use to disable this BP(patch even)?

Found this in solib-svr4.c which I think is the problem:
static const char * const bkpt_names[] =
{
"_start",
"__start",
"main",
NULL
};
...
...
if (!current_inferior ()->attach_flag)
{
for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++)
{
msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
{
sym_addr = SYMBOL_VALUE_ADDRESS (msymbol);
sym_addr = gdbarch_convert_from_func_ptr_addr (target_gdbarch,
sym_addr,
&current_target);
create_solib_event_breakpoint (target_gdbarch, sym_addr);
return 1;
}
}
}

This will insert the above BP just because the symbol _start is present. Seems like
there are missing safe guards to avoid the unwanted BP

Jocke