From patchwork Mon Apr 20 11:08:46 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Matthias_M=C3=A4nnich?= X-Patchwork-Id: 39102 From: maennich@google.com (Matthias Maennich) Date: Mon, 20 Apr 2020 13:08:46 +0200 Subject: [PATCH 8/8] abg-elf-helpers: migrate maybe_adjust_et_rel_sym_addr_to_abs_addr In-Reply-To: <20200420110846.218792-1-maennich@google.com> References: <20200420110846.218792-1-maennich@google.com> Message-ID: <20200420110846.218792-9-maennich@google.com> Move maybe_adjust_et_rel_sym_addr_to_abs_addr to the elf-helpers dropping the wrapping overload. * src/abg-dwarf-reader.cc(maybe_adjust_et_rel_sym_addr_to_abs_addr): Move out functions (drop the wrapped overload completely). * src/abg-elf-helpers.cc(maybe_adjust_et_rel_sym_addr_to_abs_addr): New function. * src/abg-elf-helpers.h(maybe_adjust_et_rel_sym_addr_to_abs_addr): New function declaration. Signed-off-by: Matthias Maennich --- src/abg-dwarf-reader.cc | 73 ++++------------------------------------- src/abg-elf-helpers.cc | 40 ++++++++++++++++++++++ src/abg-elf-helpers.h | 3 ++ 3 files changed, 49 insertions(+), 67 deletions(-) diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index dc3332410b1e..c65c01776398 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -6425,7 +6425,8 @@ public: { GElf_Addr symbol_value = - maybe_adjust_et_rel_sym_addr_to_abs_addr(sym); + maybe_adjust_et_rel_sym_addr_to_abs_addr(elf_handle(), + sym); addr_elf_symbol_sptr_map_type::const_iterator it = fun_addr_sym_map_->find(symbol_value); @@ -6563,7 +6564,8 @@ public: else { GElf_Addr symbol_value = - maybe_adjust_et_rel_sym_addr_to_abs_addr(sym); + maybe_adjust_et_rel_sym_addr_to_abs_addr(elf_handle(), + sym); addr_elf_symbol_sptr_map_type::const_iterator it = var_addr_sym_map_->find(symbol_value); if (it == var_addr_sym_map_->end()) @@ -7147,8 +7149,8 @@ public: // the symbol value of native_symbol is relative to the // section that symbol is defined in. We need to translate it // into an absolute (okay, binary-relative, rather) address. - GElf_Addr symbol_address = - maybe_adjust_et_rel_sym_addr_to_abs_addr (&native_symbol); + GElf_Addr symbol_address = maybe_adjust_et_rel_sym_addr_to_abs_addr( + elf_handle(), &native_symbol); address_set_sptr set; if (symbol->is_function()) @@ -7523,69 +7525,6 @@ public: return addr; } - /// Translate a section-relative symbol address (i.e, symbol value) - /// into an absolute symbol address by adding the address of the - /// section the symbol belongs to, to the address value. - /// - /// This is useful when looking at symbol values coming from - /// relocatable files (of ET_REL kind). If the binary is not - /// ET_REL, then the function does nothing and returns the input - /// address unchanged. - /// - /// @param addr the symbol address to possibly translate. - /// - /// @param section the section the symbol which value is @p addr - /// belongs to. - /// - /// @return the section-relative address, translated into an - /// absolute address, if @p section is an ET_REL binary. Otherwise, - /// return @p addr, unchanged. - GElf_Addr - maybe_adjust_et_rel_sym_addr_to_abs_addr(GElf_Addr addr, Elf_Scn *section) - { - if (!section) - return addr; - - Elf* elf = elf_handle(); - GElf_Ehdr elf_header; - - if (!gelf_getehdr(elf, &elf_header)) - return addr; - - if (elf_header.e_type != ET_REL) - return addr; - - GElf_Shdr section_header; - if (!gelf_getshdr(section, §ion_header)) - return addr; - - return addr + section_header.sh_addr; - } - - /// Translate a section-relative symbol address (i.e, symbol value) - /// into an absolute symbol address by adding the address of the - /// section the symbol belongs to, to the address value. - /// - /// This is useful when looking at symbol values coming from - /// relocatable files (of ET_REL kind). If the binary is not - /// ET_REL, then the function does nothing and returns the input - /// address unchanged. - /// - /// @param sym the symbol whose address to possibly needs to be - /// translated. - /// - /// @return the section-relative address, translated into an - /// absolute address, if @p sym is from an ET_REL binary. - /// Otherwise, return the address of @p sym, unchanged. - GElf_Addr - maybe_adjust_et_rel_sym_addr_to_abs_addr(GElf_Sym *sym) - { - Elf_Scn *symbol_section = elf_getscn(elf_handle(), sym->st_shndx); - GElf_Addr result = sym->st_value; - result = maybe_adjust_et_rel_sym_addr_to_abs_addr(result, symbol_section); - return result; - } - /// Test if a given address is in a given section. /// /// @param addr the address to consider. diff --git a/src/abg-elf-helpers.cc b/src/abg-elf-helpers.cc index 895feb6f7768..02ecbcf250ed 100644 --- a/src/abg-elf-helpers.cc +++ b/src/abg-elf-helpers.cc @@ -987,5 +987,45 @@ is_dso(Elf* elf_handle) return elf_header.e_type == ET_DYN; } +/// Translate a section-relative symbol address (i.e, symbol value) +/// into an absolute symbol address by adding the address of the +/// section the symbol belongs to, to the address value. +/// +/// This is useful when looking at symbol values coming from +/// relocatable files (of ET_REL kind). If the binary is not +/// ET_REL, then the function does nothing and returns the input +/// address unchanged. +/// +/// @param elf_handle the elf handle for the binary to consider. +/// +/// @param sym the symbol whose address to possibly needs to be +/// translated. +/// +/// @return the section-relative address, translated into an +/// absolute address, if @p sym is from an ET_REL binary. +/// Otherwise, return the address of @p sym, unchanged. +GElf_Addr +maybe_adjust_et_rel_sym_addr_to_abs_addr(Elf* elf_handle, GElf_Sym* sym) +{ + Elf_Scn* symbol_section = elf_getscn(elf_handle, sym->st_shndx); + GElf_Addr addr = sym->st_value; + + if (!symbol_section) + return addr; + + GElf_Ehdr elf_header; + if (!gelf_getehdr(elf_handle, &elf_header)) + return addr; + + if (elf_header.e_type != ET_REL) + return addr; + + GElf_Shdr section_header; + if (!gelf_getshdr(symbol_section, §ion_header)) + return addr; + + return addr + section_header.sh_addr; +} + } // end namespace elf_helpers } // end namespace abigail diff --git a/src/abg-elf-helpers.h b/src/abg-elf-helpers.h index 6eff245a6a30..647c92703dfa 100644 --- a/src/abg-elf-helpers.h +++ b/src/abg-elf-helpers.h @@ -174,6 +174,9 @@ is_executable(Elf* elf_handle); bool is_dso(Elf* elf_handle); +GElf_Addr +maybe_adjust_et_rel_sym_addr_to_abs_addr(Elf* elf_handle, GElf_Sym* sym); + } // end namespace elf_helpers } // end namespace abigail