From patchwork Thu Nov 21 19:08:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Jeanson X-Patchwork-Id: 101692 X-Patchwork-Delegate: fweimer@redhat.com 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 B81D0385771E for ; Thu, 21 Nov 2024 19:17:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B81D0385771E Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=efficios.com header.i=@efficios.com header.a=rsa-sha256 header.s=smtpout1 header.b=RXpF3P+g X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from smtpout.efficios.com (smtpout.efficios.com [167.114.26.122]) by sourceware.org (Postfix) with ESMTPS id 99963385781B for ; Thu, 21 Nov 2024 19:09:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 99963385781B Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=efficios.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=efficios.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 99963385781B Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=167.114.26.122 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732216187; cv=none; b=I1A03kKB7diF/QrKHVKElhgDTkRmb4okUFfVTPTc3Xex6a6R1KOPeLc7C+cqh0WBP8Tfp8KNPSjkKqvnATI0+yCdiatCsPNYBpPbwO4/qYmDB5VEQ3QRqHadflCgkMkQceEYLk9Z+vwEokPOVlB+pw+DNMMA/JGTUxw0nVOgzHs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1732216187; c=relaxed/simple; bh=zRR5npomnPJm3yN8G47LKmRIVDVV4qRma9Fv6NLBP6g=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=TWuBXYTl94BrBPXlMVIPiYTFeYFVZDhvTUkwTJjr2JqSP+93+G7wyyWtEL7VFUei3/riH5QgyXrS0Zoj/XPWVbQJjzo2EMSEOUxslg/695QMgKHUTww/3smK6qLZRxhoXlsIan0gdSeeQrpzJRkSpQGaKMJRiBdGHwHfm62KCeE= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 99963385781B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=efficios.com; s=smtpout1; t=1732216179; bh=zRR5npomnPJm3yN8G47LKmRIVDVV4qRma9Fv6NLBP6g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RXpF3P+g3hTb1GiHzYYFqJR84LqSCRJiY3s276a5PYt0CcU6apbPTUON6vPUsoI6b 32IlIWFmWeh1h26U5EMBl+RxWWmX864VCIsbr7vm0+Llhv22pNQq30o6rcg6HHSkgV tQlshXb2nbZiegLLnQlgk45PB7U4COC12l/IktdCiPRpl60YzsSr6x+g9cz1AYwiVu hePAFyn7x19Thi33mMBpiGhfB4mPQiiO9LvUO3/nwvd4FGObY2rDw13AiXwovBqAzE zgG3/SmQgdtoliC+8AGLBncDGkWkTdsFpBtln0JCdHek/5NWUYYurQK1abOj3Rriax k++0XHKmdkhdg== Received: from laptop-mjeanson.internal.efficios.com (96-127-217-162.qc.cable.ebox.net [96.127.217.162]) by smtpout.efficios.com (Postfix) with ESMTPSA id 4XvSTb4MrQz13GG; Thu, 21 Nov 2024 14:09:39 -0500 (EST) From: Michael Jeanson To: libc-alpha@sourceware.org Cc: Michael Jeanson , Florian Weimer , Carlos O'Donell , DJ Delorie , Mathieu Desnoyers Subject: [PATCH v14 5/9] nptl: add rtld_hidden_proto to __rseq_size and __rseq_offset Date: Thu, 21 Nov 2024 14:08:55 -0500 Message-ID: <20241121190924.837446-6-mjeanson@efficios.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241121190924.837446-1-mjeanson@efficios.com> References: <20241121190924.837446-1-mjeanson@efficios.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org This allows accessing the internal aliases of __rseq_size and __rseq_offset from ld.so without ifdefs and avoids a PLT entry in ld.so for both variables. Signed-off-by: Michael Jeanson Reviewed-by: Mathieu Desnoyers --- sysdeps/unix/sysv/linux/dl-rseq-symbols.S | 27 ++++++++++++++++------- sysdeps/unix/sysv/linux/rseq-internal.h | 16 ++++++++------ 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/sysdeps/unix/sysv/linux/dl-rseq-symbols.S b/sysdeps/unix/sysv/linux/dl-rseq-symbols.S index b4bba06a99..66b33c1096 100644 --- a/sysdeps/unix/sysv/linux/dl-rseq-symbols.S +++ b/sysdeps/unix/sysv/linux/dl-rseq-symbols.S @@ -27,14 +27,18 @@ /* Some targets define a macro to denote the zero register. */ #undef zero -/* Define 2 symbols: '__rseq_size' is public const and '_rseq_size' (an - alias of '__rseq_size') is hidden and writable for internal use by the - dynamic linker which will initialize the value both symbols point to - before copy relocations take place. */ +/* Define 3 symbols: '__rseq_size' is public const and then '_rseq_size' and + '__GI___rseq_size' (both aliases of '__rseq_size') are hidden, '_rseq_size' + is writable for internal use by the dynamic linker which will initialize + the value the symbols point to before copy relocations take place. */ .globl __rseq_size .type __rseq_size, %object .size __rseq_size, 4 + .hidden __GI___rseq_size + .globl __GI___rseq_size + .type __GI___rseq_size, %object + .size __GI___rseq_size, 4 .hidden _rseq_size .globl _rseq_size .type _rseq_size, %object @@ -42,17 +46,23 @@ .section .data.rel.ro .balign 4 __rseq_size: +__GI___rseq_size: _rseq_size: .zero 4 -/* Define 2 symbols: '__rseq_offset' is public const and '_rseq_offset' (an - alias of '__rseq_offset') is hidden and writable for internal use by the - dynamic linker which will initialize the value both symbols point to - before copy relocations take place. */ +/* Define 3 symbols: '__rseq_offset' is public const and then '_rseq_offset' + and '__GI___rseq_offset' (both aliases of '__rseq_offset') are hidden, + '_rseq_offset' is writable for internal use by the dynamic linker which will + initialize the value the symbols point to before copy relocations take + place. */ .globl __rseq_offset .type __rseq_offset, %object .size __rseq_offset, RSEQ_OFFSET_SIZE + .hidden __GI___rseq_offset + .globl __GI___rseq_offset + .type __GI___rseq_offset, %object + .size __GI___rseq_offset, RSEQ_OFFSET_SIZE .hidden _rseq_offset .globl _rseq_offset .type _rseq_offset, %object @@ -60,5 +70,6 @@ _rseq_size: .section .data.rel.ro .balign RSEQ_OFFSET_SIZE __rseq_offset: +__GI___rseq_offset: _rseq_offset: .zero RSEQ_OFFSET_SIZE diff --git a/sysdeps/unix/sysv/linux/rseq-internal.h b/sysdeps/unix/sysv/linux/rseq-internal.h index 7e0804ec52..30b3d5bb19 100644 --- a/sysdeps/unix/sysv/linux/rseq-internal.h +++ b/sysdeps/unix/sysv/linux/rseq-internal.h @@ -24,6 +24,7 @@ #include #include #include +#include /* Minimum size of the rseq area allocation required by the syscall. The actually used rseq feature size may be less (20 bytes initially). */ @@ -52,19 +53,20 @@ extern unsigned int _rseq_size attribute_hidden; In .data.relro but not yet write-protected. */ extern ptrdiff_t _rseq_offset attribute_hidden; +/* We want to use rtld_hidden_proto in order to call the internal aliases + of __rseq_size and __rseq_offset from ld.so. This avoids a PLT entry in + ld.so for both variables. */ +rtld_hidden_proto (__rseq_size) +rtld_hidden_proto (__rseq_offset) + #ifdef RSEQ_SIG static inline bool rseq_register_current_thread (struct pthread *self, bool do_rseq) { if (do_rseq) { - unsigned int size; -#if IS_IN (rtld) - /* Use the hidden symbol in ld.so. */ - size = _rseq_size; -#else - size = __rseq_size; -#endif + unsigned int size = __rseq_size; + if (size < RSEQ_AREA_SIZE_INITIAL) /* The initial implementation used only 20 bytes out of 32, but still expected size 32. */