* solib-svr4.c: Add include of "auxv.h".
authorJoel Brobecker <brobecker@gnat.com>
Mon, 17 Sep 2007 19:32:53 +0000 (19:32 +0000)
committerJoel Brobecker <brobecker@gnat.com>
Mon, 17 Sep 2007 19:32:53 +0000 (19:32 +0000)
        (enable_break): Use the AT_BASE auxiliary entry if available.
        * Makefile.in (solib-svr4.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/solib-svr4.c

index 9e662f945ae5589894aeb5ac52b6c045a8b991da..f22d6a8e892c4fd6f80a6df941d28df5420e3c94 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-17  Joel Brobecker  <brobecker@adacore.com>
+
+       * solib-svr4.c: Add include of "auxv.h".
+       (enable_break): Use the AT_BASE auxiliary entry if available.
+       * Makefile.in (solib-svr4.o): Update dependencies.
+
 2007-09-17  Joel Brobecker  <brobecker@adacore.com>
 
        * NEWS: Create a new section for the next release branch.
index 65fc5b20fbf8991675cb47c34a3922cbd32d13a8..cebfbc9bb1261110c9c16ea32d98a9c0472afc76 100644 (file)
@@ -2622,7 +2622,7 @@ solib-svr4.o: solib-svr4.c $(defs_h) $(elf_external_h) $(elf_common_h) \
        $(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)
index 0c658ea5ab0ec6525dcf81ed5337f89555c263bc..702e6f685bb53bcdf5e5cd6c8b0b979ef2ede299 100644 (file)
@@ -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 (&current_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 ()