mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-14 15:50:34 +00:00
* ppc-linux-tdep.c (ppc64_linux_convert_from_func_ptr_addr): Read
and manually relocate .opd contents from BFD instead of reading them from target memory.
This commit is contained in:
parent
8c9b70b1a5
commit
e84ee2403c
@ -1,3 +1,9 @@
|
||||
2008-08-21 Ulrich Weigand <uweigand@de.ibm.com>
|
||||
|
||||
* ppc-linux-tdep.c (ppc64_linux_convert_from_func_ptr_addr): Read
|
||||
and manually relocate .opd contents from BFD instead of reading
|
||||
them from target memory.
|
||||
|
||||
2008-08-21 Daniel Jacobowitz <dan@codesourcery.com>
|
||||
|
||||
* dwarf2read.c (processing_current_prefix): Delete static
|
||||
|
@ -604,7 +604,36 @@ ppc64_linux_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
|
||||
|
||||
/* Check if ADDR points to a function descriptor. */
|
||||
if (s && strcmp (s->the_bfd_section->name, ".opd") == 0)
|
||||
return get_target_memory_unsigned (targ, addr, 8);
|
||||
{
|
||||
/* There may be relocations that need to be applied to the .opd
|
||||
section. Unfortunately, this function may be called at a time
|
||||
where these relocations have not yet been performed -- this can
|
||||
happen for example shortly after a library has been loaded with
|
||||
dlopen, but ld.so has not yet applied the relocations.
|
||||
|
||||
To cope with both the case where the relocation has been applied,
|
||||
and the case where it has not yet been applied, we do *not* read
|
||||
the (maybe) relocated value from target memory, but we instead
|
||||
read the non-relocated value from the BFD, and apply the relocation
|
||||
offset manually.
|
||||
|
||||
This makes the assumption that all .opd entries are always relocated
|
||||
by the same offset the section itself was relocated. This should
|
||||
always be the case for GNU/Linux executables and shared libraries.
|
||||
Note that other kind of object files (e.g. those added via
|
||||
add-symbol-files) will currently never end up here anyway, as this
|
||||
function accesses *target* sections only; only the main exec and
|
||||
shared libraries are ever added to the target. */
|
||||
|
||||
gdb_byte buf[8];
|
||||
int res;
|
||||
|
||||
res = bfd_get_section_contents (s->bfd, s->the_bfd_section,
|
||||
&buf, addr - s->addr, 8);
|
||||
if (res != 0)
|
||||
return extract_unsigned_integer (buf, 8)
|
||||
- bfd_section_vma (s->bfd, s->the_bfd_section) + s->addr;
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user