From patchwork Thu Apr 7 16:29:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 52711 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8E60B3857C71 for ; Thu, 7 Apr 2022 16:30:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8E60B3857C71 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1649349022; bh=uxfIk5XxRUEQLdJAiDFsbcsx7FyeZAOwkek9xhMen8k=; h=Date:Subject:To:List-Id:List-Unsubscribe:List-Archive:List-Help: List-Subscribe:From:Reply-To:Cc:From; b=G3cGSsY56leedYQMA3GJJrwqFgeiDIRzV5WC93sIphhcPahadcAc2N170tAMGpSmK mgDPtOih2AKV13cHAS0zxhtQLFXxWV/3KOCNTGGvVyz1qStv4bZxoywhcJkv6uX+5s fwrxXxU9ri6m/F53JMtq5R170l8Q9SqtlPh6/ySg= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-ed1-x549.google.com (mail-ed1-x549.google.com [IPv6:2a00:1450:4864:20::549]) by sourceware.org (Postfix) with ESMTPS id 395DE3860825 for ; Thu, 7 Apr 2022 16:29:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 395DE3860825 Received: by mail-ed1-x549.google.com with SMTP id m23-20020a056402051700b0041cd56be44cso3230705edv.10 for ; Thu, 07 Apr 2022 09:29:39 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:message-id:mime-version:subject:from:to:cc; bh=uxfIk5XxRUEQLdJAiDFsbcsx7FyeZAOwkek9xhMen8k=; b=tvN4n+n3VIKqxoBBKWuwe8BxeWxhL3COkWhBqOcVlebc7ZTHPKw1CQrMRqrut5d4ib MBK7RRopWg/d54reM7Qiqtn1MRgCJzRaQa33upMmsQ95PQD4MFH/KoGc32Do+qvU4cfT vPE/37qZB6pv2xtyWOJPHHyyXJ06DMiMCKMErxEpxCaidJn5qa6hEJoHsLmhasaTt3qS uToqgyT4JFRlYe7UnMGlaOeck6OJfO9qF4XNiqQETjb4W5nKKIpxK+M700p+VUV6RkXB 5dwew56k31BSXXFyhaT1ixYTD6u7jN2jS+HOXTKz9XWItG5MoSgzQYZk0354tiN0QzdS 0LJw== X-Gm-Message-State: AOAM5300P7KnpwBYWnnPuDnVdidooXIviuYPRZ7d9agqgSQARPLdSaWt iQFvswkuw4SGOr/1UqnEs8PdcMCf3/z1S7jMgDtSDORr71CcaiEq4U1Q/LSCF98ICs/YMkBEH9D 9oZv2I3W6TQ7GSEDaj68yTDc13Or3vPvEGViAwNRn62BTIWQ3ve0yhV6NmH1qcBUEUf81X+E= X-Google-Smtp-Source: ABdhPJzGmtheMWxgTgY70ZJECGNEkPit9zJy3u0RKxP+mP6WHZxMVDC83jzYfAMgE791LNjvB6VSOEOzBoHHyg== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:210:22d2:3f86:2861:f964]) (user=gprocida job=sendgmr) by 2002:a17:907:608d:b0:6e7:f3e1:755 with SMTP id ht13-20020a170907608d00b006e7f3e10755mr14086879ejc.390.1649348977327; Thu, 07 Apr 2022 09:29:37 -0700 (PDT) Date: Thu, 7 Apr 2022 17:29:25 +0100 Message-Id: <20220407162926.2076100-1-gprocida@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH 1/2] symtab: refactor ELF symbol value tweaks To: libabigail@sourceware.org X-Spam-Status: No, score=-21.5 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libabigail@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list of the Libabigail project List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: Giuliano Procida via Libabigail From: Giuliano Procida Reply-To: Giuliano Procida Cc: maennich@google.com, kernel-team@android.com, willdeacon@google.com Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" A previous changes duplicated some logic for tweaking ELF symbol values (and possibly updating some bookkeeping information). This change refactors the code so the logic is in one place, in symtab::get_symbol_value. * src/abg-symtab-reader.cc (symtab::load_): Replace address tweaking logic with a call to get_symbol_value. (symtab::add_alternative_address_lookups): Likewise. (symtab::get_symbol_value): New function containing address tweaking logic for PPC and ARM. Signed-off-by: Giuliano Procida --- src/abg-symtab-reader.cc | 81 ++++++++++++++++++++-------------------- src/abg-symtab-reader.h | 5 +++ 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/abg-symtab-reader.cc b/src/abg-symtab-reader.cc index b42ce87d..026988ee 100644 --- a/src/abg-symtab-reader.cc +++ b/src/abg-symtab-reader.cc @@ -236,9 +236,6 @@ symtab::load_(Elf* elf_handle, std::unordered_set exported_kernel_symbols; std::unordered_map crc_values; - const bool is_arm32 = elf_helpers::architecture_is_arm32(elf_handle); - const bool is_ppc64 = elf_helpers::architecture_is_ppc64(elf_handle); - for (size_t i = 0; i < number_syms; ++i) { GElf_Sym *sym, sym_mem; @@ -347,23 +344,8 @@ symtab::load_(Elf* elf_handle, } else if (symbol_sptr->is_defined()) { - GElf_Addr symbol_value = - elf_helpers::maybe_adjust_et_rel_sym_addr_to_abs_addr(elf_handle, - sym); - - // See also symtab::add_alternative_address_lookups. - if (symbol_sptr->is_function()) - { - if (is_arm32) - // Clear bit zero of ARM32 addresses as per "ELF for the Arm - // Architecture" section 5.5.3. - // https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - symbol_value &= ~1; - else if (is_ppc64) - update_function_entry_address_symbol_map(elf_handle, sym, - symbol_sptr); - } - + const GElf_Addr symbol_value = + get_symbol_value(elf_handle, sym, symbol_sptr); const auto result = addr_symbol_map_.emplace(symbol_value, symbol_sptr); if (!result.second) @@ -483,6 +465,43 @@ symtab::update_main_symbol(GElf_Addr addr, const std::string& name) addr_symbol_map_[addr] = new_main; } +/// Various adjustments and bookkeeping may be needed to provide a correct +/// interpretation (one that matches DWARF addresses) of raw symbol values. +/// +/// @param elf_handle the ELF handle +/// +/// @param elf_symbol the ELF symbol +/// +/// @param symbol_sptr the libabigail symbol +/// +/// @return a possibly-adjusted symbol value +GElf_Addr +symtab::get_symbol_value(Elf* elf_handle, + GElf_Sym* elf_symbol, + const elf_symbol_sptr& symbol_sptr) +{ + const bool is_arm32 = elf_helpers::architecture_is_arm32(elf_handle); + const bool is_ppc64 = elf_helpers::architecture_is_ppc64(elf_handle); + + GElf_Addr symbol_value = + elf_helpers::maybe_adjust_et_rel_sym_addr_to_abs_addr(elf_handle, + elf_symbol); + + if (symbol_sptr->is_function()) + { + if (is_arm32) + // Clear bit zero of ARM32 addresses as per "ELF for the Arm + // Architecture" section 5.5.3. + // https://static.docs.arm.com/ihi0044/g/aaelf32.pdf + symbol_value &= ~1; + else if (is_ppc64) + update_function_entry_address_symbol_map(elf_handle, elf_symbol, + symbol_sptr); + } + + return symbol_value; +} + /// Update the function entry symbol map to later allow lookups of this symbol /// by entry address as well. This is relevant for ppc64 ELFv1 binaries. /// @@ -582,9 +601,6 @@ symtab::update_function_entry_address_symbol_map( void symtab::add_alternative_address_lookups(Elf* elf_handle) { - const bool is_arm32 = elf_helpers::architecture_is_arm32(elf_handle); - const bool is_ppc64 = elf_helpers::architecture_is_ppc64(elf_handle); - Elf_Scn* symtab_section = elf_helpers::find_symtab_section(elf_handle); if (!symtab_section) return; @@ -634,23 +650,8 @@ symtab::add_alternative_address_lookups(Elf* elf_handle) if (symbols.size() == 1) { const auto& symbol_sptr = symbols[0]; - GElf_Addr symbol_value = - elf_helpers::maybe_adjust_et_rel_sym_addr_to_abs_addr( - elf_handle, sym); - - // See also symtab::load_. - if (symbol_sptr->is_function()) - { - if (is_arm32) - // Clear bit zero of ARM32 addresses as per "ELF for the Arm - // Architecture" section 5.5.3. - // https://static.docs.arm.com/ihi0044/g/aaelf32.pdf - symbol_value &= ~1; - else if (is_ppc64) - update_function_entry_address_symbol_map(elf_handle, sym, - symbol_sptr); - } - + const GElf_Addr symbol_value = + get_symbol_value(elf_handle, sym, symbol_sptr); addr_symbol_map_.emplace(symbol_value, symbol_sptr); } } diff --git a/src/abg-symtab-reader.h b/src/abg-symtab-reader.h index 7ac15352..bddde2f6 100644 --- a/src/abg-symtab-reader.h +++ b/src/abg-symtab-reader.h @@ -289,6 +289,11 @@ private: load_(string_elf_symbols_map_sptr function_symbol_map, string_elf_symbols_map_sptr variables_symbol_map); + GElf_Addr + get_symbol_value(Elf* elf_handle, + GElf_Sym* elf_symbol, + const elf_symbol_sptr& symbol_sptr); + void update_function_entry_address_symbol_map(Elf* elf_handle, GElf_Sym* native_symbol,