From patchwork Fri Nov 18 09:09:07 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giuliano Procida X-Patchwork-Id: 60817 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 D774238432FC for ; Fri, 18 Nov 2022 09:09:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D774238432FC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1668762563; bh=EZ1aetppSZ/0x9vngKQZJAgjbG9s3fr3OIJN0hMF5ZY=; h=Date:Subject:To:Cc:List-Id:List-Unsubscribe:List-Archive: List-Help:List-Subscribe:From:Reply-To:From; b=Tp7nbrOHuTsYAM75/pmoWKFQpBSeTrOJNYwyAMySlDhV+6neH3VEQ4dBij0ggl4Cv Qs0cCUXCrZ2NEI2m87WwxG5TTfiToms2fw890/tFHL0hkEnw+R4ZQ+ZlfokHS8dAi3 JRYkLuDhcKGQZXn8q0xykecDcDTK8jlHtuonvGMo= X-Original-To: libabigail@sourceware.org Delivered-To: libabigail@sourceware.org Received: from mail-wm1-x34a.google.com (mail-wm1-x34a.google.com [IPv6:2a00:1450:4864:20::34a]) by sourceware.org (Postfix) with ESMTPS id C95A638493CB for ; Fri, 18 Nov 2022 09:09:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C95A638493CB Received: by mail-wm1-x34a.google.com with SMTP id 84-20020a1c0257000000b003cfe9e8e3f9so2003412wmc.0 for ; Fri, 18 Nov 2022 01:09:18 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=EZ1aetppSZ/0x9vngKQZJAgjbG9s3fr3OIJN0hMF5ZY=; b=KAcsz61cyP+s5tbm5KOXFf0hST2UzSyePICGTeTHKjLSTS0sd1RB4XYSDn70yyvK0g +YIL3zfT4gfxYkqvxIyKNx4In5o8plNNsnbuVC8Z09lYaIx2CdnAKz9lM1et+JMs8Yxb 5eBbIyz2D3DSFWykWUqeapwLHTssba/z/UjAE+EIHEq2bJEEmGU/rQDKY7Y7MH5eGAHq JeJn4XNpBINECg+mV0uJXRObZERws+TbtLc8uzUPCDw1dNVICj2E8QKpJ/xVXhOTdMfP Z63I4FJPMyW+Bdd6Mq70SsNctHHi/ES9xIMpS94+MsZ4q9HBp9mEMMlWYbGRjEd+nPpb ZYrg== X-Gm-Message-State: ANoB5pkuVMKHTTIkZHLnDkCe3PqZ1ih2VvJXKeR2O5RcUGoEVCUfQLi6 hXCZcWH/NCDtIUHjgyY1Jf1sY/Uv4uLgy/yK4J7pwc5oHwUYQZUnA6XXNuM3/jCez5pWC8NylAp RPwKkPdBcSsplglTto/zuf8DdLA4wuhkhLVms7OofW5QzYrdrsC0MylF6cU0DoC2+vXI5fRU= X-Google-Smtp-Source: AA0mqf6Tlx59zr0mrJOY8WebmWFPgN50UXlyxYZnAx1aGt34U0mViZRtFgRH7+usq6zHlW8VXP+RbML7Kkvugg== X-Received: from tef.lon.corp.google.com ([2a00:79e0:d:209:1fbf:58c5:942:359f]) (user=gprocida job=sendgmr) by 2002:a05:6000:10d:b0:236:9aa8:e69a with SMTP id o13-20020a056000010d00b002369aa8e69amr3833958wrx.31.1668762557518; Fri, 18 Nov 2022 01:09:17 -0800 (PST) Date: Fri, 18 Nov 2022 09:09:07 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.38.1.584.g0f3c55d4c2-goog Message-ID: <20221118090907.4013918-1-gprocida@google.com> Subject: [PATCH] symtab: add support for CRC values from __kcrctab To: libabigail@sourceware.org Cc: dodji@seketeli.org, kernel-team@android.com, gprocida@google.com, maennich@google.com, sidnayyar@google.com, vvvvvv@google.com X-Spam-Status: No, score=-22.3 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, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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 Errors-To: libabigail-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libabigail" From: Aleksei Vetrov New kernels changed the format of storing CRC values from absolute symbol value to the address in __kcrctab or __kcrctab_gpl section. This change adds support for CRC values described in this format. * src/abg-elf-helpers.h (get_crc_for_symbol): Defined new helper function to extract CRC from ELF symbol. * src/abg-elf-helpers.cc (get_crc_for_symbol): Implemented this function with support of old and new CRC values format. * src/abg-symtab-reader.cc (symtab::load_): Used the new function when building CRC values map. Change-Id: I7de5c737d5caaef0c5b7b2ea0d448368889a16be Signed-off-by: Aleksei Vetrov --- src/abg-elf-helpers.cc | 47 ++++++++++++++++++++++++++++++++++++++++ src/abg-elf-helpers.h | 3 +++ src/abg-symtab-reader.cc | 5 ++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/abg-elf-helpers.cc b/src/abg-elf-helpers.cc index cbcf5428..8c6c4448 100644 --- a/src/abg-elf-helpers.cc +++ b/src/abg-elf-helpers.cc @@ -905,6 +905,53 @@ get_version_for_symbol(Elf* elf_handle, return false; } +/// Return the CRC from the "__crc_" symbol. +/// +/// @param elf_handle the elf handle to use. +/// +/// @param crc_symbol symbol containing CRC value. +/// +/// @param crc_value the CRC found for @p crc_symbol. +/// +/// @return true iff a CRC was found for given @p crc_symbol. +bool +get_crc_for_symbol(Elf* elf_handle, GElf_Sym* crc_symbol, uint32_t& crc_value) +{ + size_t crc_section_index = crc_symbol->st_shndx; + uint64_t crc_symbol_value = crc_symbol->st_value; + if (crc_section_index == SHN_ABS) + { + crc_value = crc_symbol_value; + return true; + } + + Elf_Scn* kcrctab_section = elf_getscn(elf_handle, crc_section_index); + if (kcrctab_section == NULL) + return false; + + GElf_Shdr sheader_mem; + GElf_Shdr* sheader = gelf_getshdr(kcrctab_section, &sheader_mem); + if (sheader == NULL) + return false; + + Elf_Data* kcrctab_data = elf_rawdata(kcrctab_section, NULL); + if (kcrctab_data == NULL) + return false; + + if (crc_symbol_value < sheader->sh_addr) + return false; + + size_t offset = crc_symbol_value - sheader->sh_addr; + if (offset + sizeof(uint32_t) > kcrctab_data->d_size + || offset + sizeof(uint32_t) > sheader->sh_size) + return false; + + crc_value = *reinterpret_cast( + reinterpret_cast(kcrctab_data->d_buf) + offset); + + return true; +} + /// Test if the architecture of the current binary is ppc64. /// /// @param elf_handle the ELF handle to consider. diff --git a/src/abg-elf-helpers.h b/src/abg-elf-helpers.h index e884c6a3..37345e0e 100644 --- a/src/abg-elf-helpers.h +++ b/src/abg-elf-helpers.h @@ -141,6 +141,9 @@ get_version_for_symbol(Elf* elf_handle, bool get_def_version, elf_symbol::version& version); +bool +get_crc_for_symbol(Elf* elf_handle, GElf_Sym* crc_symbol, uint32_t& crc_value); + // // Architecture specific helpers // diff --git a/src/abg-symtab-reader.cc b/src/abg-symtab-reader.cc index 8a566f8d..d92ae3b2 100644 --- a/src/abg-symtab-reader.cc +++ b/src/abg-symtab-reader.cc @@ -314,7 +314,10 @@ symtab::load_(Elf* elf_handle, } if (is_kernel && name.rfind("__crc_", 0) == 0) { - ABG_ASSERT(crc_values.emplace(name.substr(6), sym->st_value).second); + uint32_t crc_value; + ABG_ASSERT( + elf_helpers::get_crc_for_symbol(elf_handle, sym, crc_value)); + ABG_ASSERT(crc_values.emplace(name.substr(6), crc_value).second); continue; } if (strings_section && is_kernel && name.rfind("__kstrtabns_", 0) == 0)