Index: solib-svr4.c =================================================================== RCS file: /cvs/src/src/gdb/solib-svr4.c,v retrieving revision 1.75 diff -u -p -r1.75 solib-svr4.c --- solib-svr4.c 23 Aug 2007 18:08:38 -0000 1.75 +++ solib-svr4.c 12 Sep 2007 21:03:39 -0000 @@ -41,6 +41,7 @@ #include "bfd-target.h" #include "elf-bfd.h" #include "exec.h" +#include "auxv.h" static struct link_map_offsets *svr4_fetch_link_map_offsets (void); static int svr4_have_link_map_offsets (void); @@ -1008,11 +1009,6 @@ enable_break (void) be trivial on GNU/Linux). Therefore, we have to try an alternate mechanism to find the dynamic linker's base address. */ - /* TODO drow/2006-09-12: This is somewhat fragile, because it - relies on read_pc. On both Solaris and GNU/Linux we can use - the AT_BASE auxilliary entry, which GDB now knows how to - access, to find the base address. */ - tmp_fd = solib_open (buf, &tmp_pathname); if (tmp_fd >= 0) tmp_bfd = bfd_fopen (tmp_pathname, gnutarget, FOPEN_RB, tmp_fd); @@ -1048,9 +1044,19 @@ enable_break (void) so = so->next; } + /* If we were not able to find the base address of the loader + from our so_list, then try using the AT_BASE auxilliary entry. */ + if (!load_addr_found) + if (target_auxv_search (¤t_target, AT_BASE, &load_addr) > 0) + load_addr_found = 1; + /* Otherwise we find the dynamic linker's base address by examining the current pc (which should point at the entry point for the - dynamic linker) and subtracting the offset of the entry point. */ + dynamic linker) and subtracting the offset of the entry point. + + This is more fragile than the previous approaches, but is a good + fallback method because it has actually been working well in + most cases. */ if (!load_addr_found) { load_addr = (read_pc () Index: Makefile.in =================================================================== RCS file: /cvs/src/src/gdb/Makefile.in,v retrieving revision 1.936 diff -u -p -r1.936 Makefile.in --- Makefile.in 5 Sep 2007 00:14:02 -0000 1.936 +++ Makefile.in 12 Sep 2007 21:03:07 -0000 @@ -2622,7 +2622,7 @@ solib-svr4.o: solib-svr4.c $(defs_h) $(e $(elf_mips_h) $(symtab_h) $(bfd_h) $(symfile_h) $(objfiles_h) \ $(gdbcore_h) $(target_h) $(inferior_h) $(gdb_assert_h) \ $(solist_h) $(solib_h) $(solib_svr4_h) $(bfd_target_h) $(elf_bfd_h) \ - $(exec_h) + $(exec_h) $(auxv_h) solib-target.o: solib-target.c $(defs_h) $(objfiles_h) $(solist_h) \ $(symtab_h) $(symfile_h) $(target_h) $(vec_h) $(xml_support_h) \ $(gdb_string_h)