aboutsummaryrefslogtreecommitdiff
path: root/gdb/solib-svr4.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2007-09-17 19:32:53 +0000
committerJoel Brobecker <brobecker@gnat.com>2007-09-17 19:32:53 +0000
commit8d4e36bad1bab0ff367a2f9ab7a131d63e030de0 (patch)
tree13731aa8d6784b75c6b92c75da685041f743a6a3 /gdb/solib-svr4.c
parentf9ed52beed7a3b98293b1a84d5b96b3a9754014a (diff)
downloadgdb-8d4e36bad1bab0ff367a2f9ab7a131d63e030de0.zip
gdb-8d4e36bad1bab0ff367a2f9ab7a131d63e030de0.tar.gz
gdb-8d4e36bad1bab0ff367a2f9ab7a131d63e030de0.tar.bz2
* 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.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r--gdb/solib-svr4.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c
index 0c658ea..702e6f6 100644
--- a/gdb/solib-svr4.c
+++ b/gdb/solib-svr4.c
@@ -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 ()