summaryrefslogtreecommitdiff
path: root/gdb/ia64-tdep.c
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2009-09-29 19:09:38 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2009-09-29 19:09:38 +0000
commit9371780273a6fcb743ae7c7dc64d6dda841c1d9f (patch)
tree10d70485e77bd0aee8c09a615eb34497c919dba4 /gdb/ia64-tdep.c
parentc14a56aba89bcda812cbbb7cfc848934ea4db7d0 (diff)
downloadgdb-9371780273a6fcb743ae7c7dc64d6dda841c1d9f.tar.gz
gdb/
* ia64-tdep.c (ia64_convert_from_func_ptr_addr): New variable buf. Check first the descriptor memory is readable.
Diffstat (limited to 'gdb/ia64-tdep.c')
-rw-r--r--gdb/ia64-tdep.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/gdb/ia64-tdep.c b/gdb/ia64-tdep.c
index 058930bfc51..e9464e1de0f 100644
--- a/gdb/ia64-tdep.c
+++ b/gdb/ia64-tdep.c
@@ -3510,6 +3510,7 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
{
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
struct obj_section *s;
+ gdb_byte buf[8];
s = find_pc_section (addr);
@@ -3520,10 +3521,12 @@ ia64_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr,
/* Normally, functions live inside a section that is executable.
So, if ADDR points to a non-executable section, then treat it
as a function descriptor and return the target address iff
- the target address itself points to a section that is executable. */
- if (s && (s->the_bfd_section->flags & SEC_CODE) == 0)
+ the target address itself points to a section that is executable.
+ Check first the memory of the whole length of 8 bytes is readable. */
+ if (s && (s->the_bfd_section->flags & SEC_CODE) == 0
+ && target_read_memory (addr, buf, 8) == 0)
{
- CORE_ADDR pc = read_memory_unsigned_integer (addr, 8, byte_order);
+ CORE_ADDR pc = extract_unsigned_integer (buf, 8, byte_order);
struct obj_section *pc_section = find_pc_section (pc);
if (pc_section && (pc_section->the_bfd_section->flags & SEC_CODE))