diff options
author | Joel Brobecker <brobecker@gnat.com> | 2007-09-17 19:32:53 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2007-09-17 19:32:53 +0000 |
commit | 8d4e36bad1bab0ff367a2f9ab7a131d63e030de0 (patch) | |
tree | 13731aa8d6784b75c6b92c75da685041f743a6a3 /gdb/solib-svr4.c | |
parent | f9ed52beed7a3b98293b1a84d5b96b3a9754014a (diff) | |
download | gdb-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.c | 18 |
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 (¤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 () |