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, From patchwork Thu Apr 7 16:29:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 52712 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 9EBE93858002 for ; Thu, 7 Apr 2022 16:30:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9EBE93858002 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1649349025; bh=xr0SHktFuRg9MAeVKCIoqziSCkC7twoo9/lbJIsmenY=; h=Date:In-Reply-To:References:Subject:To:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:Cc:From; b=Q6FoP3+/sDQxfE/nwTv0sWiH8+vv8UQD2FYqarKGjQmEuw2V59Mm60YAUkZvPYLnH xPb+3qdnWKOBgO619TOvX0CUBGsh6A3Mt+eJhQwjHErFrAMbP+d7YdlSEDDoPJf+9/ t6T4d1gr/XNFBOYvyGe8dWtghw75EpXbL/cG75Ac= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-ej1-x649.google.com (mail-ej1-x649.google.com [IPv6:2a00:1450:4864:20::649]) by sourceware.org (Postfix) with ESMTPS id A4B9E3839816 for ; Thu, 7 Apr 2022 16:29:42 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A4B9E3839816 Received: by mail-ej1-x649.google.com with SMTP id mp18-20020a1709071b1200b006e7f314ecb3so3370032ejc.23 for ; Thu, 07 Apr 2022 09:29:42 -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:in-reply-to:message-id:mime-version :references:subject:from:to:cc; bh=xr0SHktFuRg9MAeVKCIoqziSCkC7twoo9/lbJIsmenY=; b=weNrHAQ0bXIIRtrMsihZishYUlYfNZe6OVBcLe42KfPlLGCPcLkuO8FNw7Eao4/pFp 9yyar8pKDwPAl+fHjB+7bwYZJopzGfRkBacARbQDwlpYT+Rupg8gApKR5CWh2BqMqXKz +2sm9jiW7xPuJ6w4164xJBBr8YxGxQANatiM+wgyCES1evJgKwFlx4ehUnBRaH3Tg5lZ GyOknNrFyN8NBgGI2SBI67KWO7AwHqVizf99IU5V05r9BK1K7AWPkTNaMeKYUW5rx6Kh P5YbapGRrhabFgxmznLGPb2oTdsCdw3AwXT/m5fjMsFW6lfCAuPTXWJDCm4IF9Hwp8Nl 6IrQ== X-Gm-Message-State: AOAM532JpKI0XuC1ltFl2+Vb3e/o0Bm4NaT9AqdKEFSiUHdcievWWefs Hi8QV+slOq/aqx8zg9luLed8iFM9M858MZCzo7hRpcrrrbIyajwSjObJS+hbs1gCO1hcfIqyQC/ uikmpJtGCbrFbynwL7i0aH7jp45F1nEua/cSDU3Ig4WucmOiGIEa3ymBojenxQeBLuCXFOy4= X-Google-Smtp-Source: ABdhPJw+RxAaK23uCCBjpcF6AspcuksqvTjW1ABDvPPOfv+wyOTvWhDme/BM6lLkIKOJLVVXPiO+3ooowV4Cew== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:210:22d2:3f86:2861:f964]) (user=gprocida job=sendgmr) by 2002:a05:6402:1941:b0:413:2b7e:676e with SMTP id f1-20020a056402194100b004132b7e676emr15422028edz.114.1649348981272; Thu, 07 Apr 2022 09:29:41 -0700 (PDT) Date: Thu, 7 Apr 2022 17:29:26 +0100 In-Reply-To: <20220407162926.2076100-1-gprocida@google.com> Message-Id: <20220407162926.2076100-2-gprocida@google.com> Mime-Version: 1.0 References: <20220407162926.2076100-1-gprocida@google.com> X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH 2/2] symtab: fix up 64-bit ARM address which may contain tags 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" 64-bit ARM addresses normally have bits 47 to 63 as either all 0 or all 1. If tagging is used, bits 56 to 63 can vary, but the interpretation of such values is as if the bits were all the same as bit 55. Such tagging is used for HWASAN and this affects the ELF symbol values seen in shared libraries. This commit changes the interpretation of 64-bit ARM symbol values by unconditionally extending bit 55 into bits 56 to 63. This fixes missing types for symbols in HWASAN-compiled libraries. * src/abg-elf-helpers.cc: (architecture_is_arm64): Add helper. * src/abg-elf-helpers.h: Likewise. * src/abg-symtab-reader.cc: (get_symbol_value): Adjust 64-bit ARM symbol values by extending bit 55 into bits 56 to 63. Signed-off-by: Giuliano Procida --- src/abg-elf-helpers.cc | 17 +++++++++++++++++ src/abg-elf-helpers.h | 3 +++ src/abg-symtab-reader.cc | 6 ++++++ 3 files changed, 26 insertions(+) diff --git a/src/abg-elf-helpers.cc b/src/abg-elf-helpers.cc index ee631831..787a05ff 100644 --- a/src/abg-elf-helpers.cc +++ b/src/abg-elf-helpers.cc @@ -900,6 +900,23 @@ architecture_is_arm32(Elf* elf_handle) return (elf_header && elf_header->e_machine == EM_ARM); } +/// Test if the architecture of the current binary is arm64. +/// +/// @param elf_handle the ELF handle to consider. +/// +/// @return true iff the architecture of the current binary is arm64. +bool +architecture_is_arm64(Elf* elf_handle) +{ +#ifdef HAVE_EM_AARCH64_MACRO + GElf_Ehdr eh_mem; + GElf_Ehdr* elf_header = gelf_getehdr(elf_handle, &eh_mem); + return (elf_header && elf_header->e_machine == EM_AARCH64); +#else + return false; +#endif +} + /// Test if the endianness of the current binary is Big Endian. /// /// https://en.wikipedia.org/wiki/Endianness. diff --git a/src/abg-elf-helpers.h b/src/abg-elf-helpers.h index 718ce9c1..afaff24a 100644 --- a/src/abg-elf-helpers.h +++ b/src/abg-elf-helpers.h @@ -147,6 +147,9 @@ architecture_is_ppc64(Elf* elf_handle); bool architecture_is_arm32(Elf* elf_handle); +bool +architecture_is_arm64(Elf* elf_handle); + bool architecture_is_big_endian(Elf* elf_handle); diff --git a/src/abg-symtab-reader.cc b/src/abg-symtab-reader.cc index 026988ee..3740cb7a 100644 --- a/src/abg-symtab-reader.cc +++ b/src/abg-symtab-reader.cc @@ -481,6 +481,7 @@ symtab::get_symbol_value(Elf* elf_handle, const elf_symbol_sptr& symbol_sptr) { const bool is_arm32 = elf_helpers::architecture_is_arm32(elf_handle); + const bool is_arm64 = elf_helpers::architecture_is_arm64(elf_handle); const bool is_ppc64 = elf_helpers::architecture_is_ppc64(elf_handle); GElf_Addr symbol_value = @@ -498,6 +499,11 @@ symtab::get_symbol_value(Elf* elf_handle, update_function_entry_address_symbol_map(elf_handle, elf_symbol, symbol_sptr); } + if (is_arm64) + // Copy bit 55 over bits 56 to 63 which may be tag information. + symbol_value = symbol_value & (1ULL<<55) + ? symbol_value | (0xffULL<<56) + : symbol_value &~ (0xffULL<<56); return symbol_value; }