public inbox for gdb-cvs@sourceware.org help / color / mirror / Atom feed
From: Markus Metzger <mmetzger@sourceware.org> To: gdb-cvs@sourceware.org Subject: [binutils-gdb] gdb: update gnu ifunc resolve Date: Tue, 18 Oct 2022 13:25:48 +0000 (GMT) [thread overview] Message-ID: <20221018132548.B19A23858406@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1dc9084f5e95fd9a1f2f0e9baf9c6e52c5a5ee29 commit 1dc9084f5e95fd9a1f2f0e9baf9c6e52c5a5ee29 Author: Markus Metzger <markus.t.metzger@intel.com> Date: Mon May 30 09:35:29 2022 +0200 gdb: update gnu ifunc resolve Update elf_gnu_ifunc_resolve_by_cache() and elf_gnu_ifunc_resolve_by_got() to use gdbarch_iterate_over_objfiles_in_search_order() in order to restrict the objfile traversal to the initial namespace. In order to extend this to other namespaces, we'd need to provide context, e.g. via an objfile inside that namespace. Diff: --- gdb/elfread.c | 153 +++++++++++++++++++++++++++++++++------------------------- 1 file changed, 87 insertions(+), 66 deletions(-) diff --git a/gdb/elfread.c b/gdb/elfread.c index 88f5a713c4f..d7fa5a6de09 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -769,32 +769,42 @@ elf_gnu_ifunc_record_cache (const char *name, CORE_ADDR addr) static int elf_gnu_ifunc_resolve_by_cache (const char *name, CORE_ADDR *addr_p) { - for (objfile *objfile : current_program_space->objfiles ()) - { - htab_t htab; - struct elf_gnu_ifunc_cache *entry_p; - void **slot; - - htab = elf_objfile_gnu_ifunc_cache_data.get (objfile); - if (htab == NULL) - continue; - - entry_p = ((struct elf_gnu_ifunc_cache *) - alloca (sizeof (*entry_p) + strlen (name))); - strcpy (entry_p->name, name); - - slot = htab_find_slot (htab, entry_p, NO_INSERT); - if (slot == NULL) - continue; - entry_p = (struct elf_gnu_ifunc_cache *) *slot; - gdb_assert (entry_p != NULL); - - if (addr_p) - *addr_p = entry_p->addr; - return 1; - } - - return 0; + int found = 0; + + /* FIXME: we only search the initial namespace. + + To search other namespaces, we would need to provide context, e.g. in + form of an objfile in that namespace. */ + gdbarch_iterate_over_objfiles_in_search_order + (target_gdbarch (), + [name, &addr_p, &found] (struct objfile *objfile) + { + htab_t htab; + elf_gnu_ifunc_cache *entry_p; + void **slot; + + htab = elf_objfile_gnu_ifunc_cache_data.get (objfile); + if (htab == NULL) + return 0; + + entry_p = ((elf_gnu_ifunc_cache *) + alloca (sizeof (*entry_p) + strlen (name))); + strcpy (entry_p->name, name); + + slot = htab_find_slot (htab, entry_p, NO_INSERT); + if (slot == NULL) + return 0; + entry_p = (elf_gnu_ifunc_cache *) *slot; + gdb_assert (entry_p != NULL); + + if (addr_p) + *addr_p = entry_p->addr; + + found = 1; + return 1; + }, nullptr); + + return found; } /* Try to find the target resolved function entry address of a STT_GNU_IFUNC @@ -810,50 +820,61 @@ elf_gnu_ifunc_resolve_by_got (const char *name, CORE_ADDR *addr_p) { char *name_got_plt; const size_t got_suffix_len = strlen (SYMBOL_GOT_PLT_SUFFIX); + int found = 0; name_got_plt = (char *) alloca (strlen (name) + got_suffix_len + 1); sprintf (name_got_plt, "%s" SYMBOL_GOT_PLT_SUFFIX, name); - for (objfile *objfile : current_program_space->objfiles ()) - { - bfd *obfd = objfile->obfd.get (); - struct gdbarch *gdbarch = objfile->arch (); - struct type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; - size_t ptr_size = ptr_type->length (); - CORE_ADDR pointer_address, addr; - asection *plt; - gdb_byte *buf = (gdb_byte *) alloca (ptr_size); - struct bound_minimal_symbol msym; - - msym = lookup_minimal_symbol (name_got_plt, NULL, objfile); - if (msym.minsym == NULL) - continue; - if (msym.minsym->type () != mst_slot_got_plt) - continue; - pointer_address = msym.value_address (); - - plt = bfd_get_section_by_name (obfd, ".plt"); - if (plt == NULL) - continue; - - if (msym.minsym->size () != ptr_size) - continue; - if (target_read_memory (pointer_address, buf, ptr_size) != 0) - continue; - addr = extract_typed_address (buf, ptr_type); - addr = gdbarch_convert_from_func_ptr_addr - (gdbarch, addr, current_inferior ()->top_target ()); - addr = gdbarch_addr_bits_remove (gdbarch, addr); - - if (elf_gnu_ifunc_record_cache (name, addr)) - { - if (addr_p != NULL) - *addr_p = addr; - return 1; - } - } - - return 0; + /* FIXME: we only search the initial namespace. + + To search other namespaces, we would need to provide context, e.g. in + form of an objfile in that namespace. */ + gdbarch_iterate_over_objfiles_in_search_order + (target_gdbarch (), + [name, name_got_plt, &addr_p, &found] (struct objfile *objfile) + { + bfd *obfd = objfile->obfd.get (); + struct gdbarch *gdbarch = objfile->arch (); + type *ptr_type = builtin_type (gdbarch)->builtin_data_ptr; + size_t ptr_size = ptr_type->length (); + CORE_ADDR pointer_address, addr; + asection *plt; + gdb_byte *buf = (gdb_byte *) alloca (ptr_size); + bound_minimal_symbol msym; + + msym = lookup_minimal_symbol (name_got_plt, NULL, objfile); + if (msym.minsym == NULL) + return 0; + if (msym.minsym->type () != mst_slot_got_plt) + return 0; + pointer_address = msym.value_address (); + + plt = bfd_get_section_by_name (obfd, ".plt"); + if (plt == NULL) + return 0; + + if (msym.minsym->size () != ptr_size) + return 0; + if (target_read_memory (pointer_address, buf, ptr_size) != 0) + return 0; + addr = extract_typed_address (buf, ptr_type); + addr = gdbarch_convert_from_func_ptr_addr + (gdbarch, addr, current_inferior ()->top_target ()); + addr = gdbarch_addr_bits_remove (gdbarch, addr); + + if (elf_gnu_ifunc_record_cache (name, addr)) + { + if (addr_p != NULL) + *addr_p = addr; + + found = 1; + return 1; + } + + return 0; + }, nullptr); + + return found; } /* Try to find the target resolved function entry address of a STT_GNU_IFUNC
reply other threads:[~2022-10-18 13:25 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=20221018132548.B19A23858406@sourceware.org \ --to=mmetzger@sourceware.org \ --cc=gdb-cvs@sourceware.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: linkBe 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; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).