From patchwork Mon Dec 30 00:25:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Wielaard X-Patchwork-Id: 103755 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 C20003858C33 for ; Mon, 30 Dec 2024 00:26:43 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C20003858C33 X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from gnu.wildebeest.org (gnu.wildebeest.org [45.83.234.184]) by sourceware.org (Postfix) with ESMTPS id BEE833858414 for ; Mon, 30 Dec 2024 00:26:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BEE833858414 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=klomp.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=klomp.org ARC-Filter: OpenARC Filter v1.0.0 sourceware.org BEE833858414 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=45.83.234.184 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1735518371; cv=none; b=qQ5BphGMv82hJYZdsNoAr4VmaBajy6EB8FBT03TVpHyHI/zOWRHEViJW54JjcTT6Vug4iqvc2Ext+Fgyidjzacm303rG+amJizqVZnhWFNaoIM0Vg2+0wfWzOWPpabqwt/EIvpgaXO4oofcQu8SiaTL8gKgO7zqWJX1zVC+LrxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1735518371; c=relaxed/simple; bh=euOpUPMTSZWIdUSMzUFgLUb3fmUdMfw+B4bXUcBevRg=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=MWPWg6tUST39yRWmQY39Q3V0+nTyViRT6mIcrA6WFgOG07koxSOPRZdiohIEiBJNRTg/CKVKqSQ+uopTFwEX7JLNdjRiofQBLcKSdavzrUq8kELpeXMpQxWJtfZxm1R7XqoNCmiEOsZl6mZOzSvw6xETP4cjrhQ0lseg67cJQtQ= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BEE833858414 Received: from r6.localdomain (82-217-174-174.cable.dynamic.v4.ziggo.nl [82.217.174.174]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by gnu.wildebeest.org (Postfix) with ESMTPSA id 21E13314136F; Mon, 30 Dec 2024 01:26:09 +0100 (CET) Received: by r6.localdomain (Postfix, from userid 1000) id 2634E340379; Mon, 30 Dec 2024 01:26:09 +0100 (CET) From: Mark Wielaard To: elfutils-devel@sourceware.org Cc: Mark Wielaard Subject: [PATCH] backends: check_special_symbol _GLOBAL_OFFSET_TABLE_ points inside .got Date: Mon, 30 Dec 2024 01:25:21 +0100 Message-ID: <20241230002521.981932-1-mark@klomp.org> X-Mailer: git-send-email 2.47.1 MIME-Version: 1.0 X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, KAM_STOCKGEN, RCVD_IN_BARRACUDACENTRAL, SPF_HELO_NONE, SPF_PASS, TXREP 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: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: elfutils-devel-bounces~patchwork=sourceware.org@sourceware.org If desthdr is ".got.plt" search for the actual ".got" section and make sure the _GLOBAL_OFFSET_TABLE_ points to it. * backends/riscv_symbol.c (riscv_check_special_symbol): Check sname is ".got.plt", find ".got" scn to check sym st_value. Signed-off-by: Mark Wielaard --- backends/riscv_symbol.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/backends/riscv_symbol.c b/backends/riscv_symbol.c index c149b8ba27cf..3de8070be873 100644 --- a/backends/riscv_symbol.c +++ b/backends/riscv_symbol.c @@ -1,4 +1,5 @@ /* RISC-V specific symbolic name handling. + Copyright (C) 2024 Mark J. Wielaard This file is part of elfutils. This file is free software; you can redistribute it and/or modify @@ -104,9 +105,29 @@ riscv_check_special_symbol (Elf *elf, const GElf_Sym *sym, /* _GLOBAL_OFFSET_TABLE_ points to the start of the .got section, but it is preceded by the .got.plt section in the output .got section. */ if (strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) - return (strcmp (sname, ".got") == 0 - && sym->st_value >= destshdr->sh_addr - && sym->st_value < destshdr->sh_addr + destshdr->sh_size); + { + if (strcmp (sname, ".got") == 0 + && sym->st_value >= destshdr->sh_addr + && sym->st_value < destshdr->sh_addr + destshdr->sh_size) + return true; + else if (strcmp (sname, ".got.plt") == 0) + { + /* Find .got section and compare against that. */ + Elf_Scn *scn = NULL; + while ((scn = elf_nextscn (elf, scn)) != NULL) + { + GElf_Shdr shdr_mem; + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); + if (shdr != NULL) + { + sname = elf_strptr (elf, shstrndx, shdr->sh_name); + if (sname != NULL && strcmp (sname, ".got") == 0) + return (sym->st_value >= shdr->sh_addr + && sym->st_value < shdr->sh_addr + shdr->sh_size); + } + } + } + } /* __global_pointer$ points to the .sdata section with an offset of 0x800. It might however fall in the .got section, in which case we