From: Will Newton <will.newton@linaro.org>
To: gdb-patches@sourceware.org
Cc: Patch Tracking <patches@linaro.org>
Subject: [PATCH] gdb/elfread.c: Enable ifunc support on ARM.
Date: Mon, 16 Dec 2013 18:24:00 -0000 [thread overview]
Message-ID: <52AF4563.2090304@linaro.org> (raw)
There are two failures in the gnu-ifunc.exp test on ARM. These are
due to the failure to resolve the correct target function when
attempting to breakpoint a GNU ifunc resolved function:
(gdb) break gnu_ifunc
Breakpoint 4 at gnu-indirect-function resolver at 0x2aacb5a2
when gnu_ifunc has been resolved this should actually be:
(gdb) break gnu_ifunc
Breakpoint 4 at 0x868c
There are two reasons for this. The first is that ARM does not have a
separate .got.plt section so looking this up will always fail. The second
is that the Thumb bit needs to be stripped from the address to allow
it to be reliably compared when inserting into the ifunc cache.
Tested with no regressions on arm-linux-gnueabihf and
x86_64-unknown-linux-gnu.
gdb/ChangeLog:
2013-12-16 Will Newton <will.newton@linaro.org>
* elfread.c (elf_rel_plt_read): Look for a .got section if
looking up .got.plt fails.
(elf_gnu_ifunc_resolve_by_got): Call gdbarch_addr_bits_remove
on address passed to elf_gnu_ifunc_record_cache.
(elf_gnu_ifunc_resolve_addr): Likewise.
(elf_gnu_ifunc_resolver_return_stop): Likewise.
---
gdb/elfread.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/gdb/elfread.c b/gdb/elfread.c
index 4a36927..30076e7 100644
--- a/gdb/elfread.c
+++ b/gdb/elfread.c
@@ -646,7 +646,12 @@ elf_rel_plt_read (struct objfile *objfile, asymbol **dyn_symbol_table)
got_plt = bfd_get_section_by_name (obfd, ".got.plt");
if (got_plt == NULL)
- return;
+ {
+ /* For platforms where there is no separate .got.plt. */
+ got_plt = bfd_get_section_by_name (obfd, ".got");
+ if (got_plt == NULL)
+ return;
+ }
/* This search algorithm is from _bfd_elf_canonicalize_dynamic_reloc. */
for (relplt = obfd->sections; relplt != NULL; relplt = relplt->next)
@@ -899,6 +904,7 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p)
addr = extract_typed_address (buf, ptr_type);
addr = gdbarch_convert_from_func_ptr_addr (gdbarch, addr,
¤t_target);
+ addr = gdbarch_addr_bits_remove (gdbarch, addr);
if (addr_p)
*addr_p = addr;
@@ -962,6 +968,7 @@ elf_gnu_ifunc_resolve_addr (struct gdbarch *gdbarch, CORE_ADDR pc)
address = value_as_address (address_val);
address = gdbarch_convert_from_func_ptr_addr (gdbarch, address,
¤t_target);
+ address = gdbarch_addr_bits_remove (gdbarch, address);
if (name_at_pc)
elf_gnu_ifunc_record_cache (name_at_pc, address);
@@ -1070,6 +1077,7 @@ elf_gnu_ifunc_resolver_return_stop (struct breakpoint *b)
resolved_pc = gdbarch_convert_from_func_ptr_addr (gdbarch,
resolved_address,
¤t_target);
+ resolved_pc = gdbarch_addr_bits_remove (gdbarch, resolved_pc);
gdb_assert (current_program_space == b->pspace || b->pspace == NULL);
elf_gnu_ifunc_record_cache (b->addr_string, resolved_pc);
--
1.8.1.4
next reply other threads:[~2013-12-16 18:24 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-16 18:24 Will Newton [this message]
2014-01-23 15:21 ` Will Newton
2014-02-04 11:28 ` Will Newton
2014-02-06 17:43 ` Pedro Alves
2014-02-10 14:57 ` Will Newton
2014-02-10 15:57 ` Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=52AF4563.2090304@linaro.org \
--to=will.newton@linaro.org \
--cc=gdb-patches@sourceware.org \
--cc=patches@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox