From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by sourceware.org (Postfix) with ESMTPS id 6E6E1385829D for ; Thu, 22 Sep 2022 09:19:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6E6E1385829D Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=xry111.site Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=xry111.site DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=xry111.site; s=default; t=1663838394; bh=MtRXiIawfXBcNKye+AQx7SI9xfogl9joQBScU4A3niw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SqDOhgIuS/z+cExprxfC60XaHBa86UlgXbuFb4b3k5MG9fAIwY7vKP1iaw8PO6R6c PsxVjLrWP+ax1aU6jSIl2KbyjzElGGhOHhQeIORQ3ZrauPQnuamWm98I2HFti/4lqF kjp8d4N3N2Ndy6xSCIIiPxdHZZL6PBl15zVz7p+s= Received: from xry111-x57s1.. (unknown [IPv6:240e:358:11dd:8700:dc73:854d:832e:4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (Client did not present a certificate) (Authenticated sender: xry111@xry111.site) by xry111.site (Postfix) with ESMTPSA id 87D96667B7; Thu, 22 Sep 2022 05:19:50 -0400 (EDT) From: Xi Ruoyao To: libc-alpha@sourceware.org Cc: caiyinyu , liuzhensong , Lulu Cheng , Wang Xuerui , Chenghua Xu , Xi Ruoyao Subject: [PATCH 1/1] LoongArch: Add static PIE support Date: Thu, 22 Sep 2022 17:19:24 +0800 Message-Id: <20220922091924.3033-2-xry111@xry111.site> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20220922091924.3033-1-xry111@xry111.site> References: <20220922091924.3033-1-xry111@xry111.site> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FROM_SUSPICIOUS_NTLD,GIT_PATCH_0,LIKELY_SPAM_FROM,SPF_HELO_PASS,SPF_PASS,TXREP,T_PDS_OTHER_BAD_TLD autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: If the compiler is new enough, enable static PIE support. In the static PIE version of _start (in rcrt1.o), use la.pcrel instead of la.got because in a static PIE we cannot use GOT entries until the dynamic relocations for GOT are resolved. --- sysdeps/loongarch/configure | 37 ++++++++++++++++++++++++++++++++++ sysdeps/loongarch/configure.ac | 14 +++++++++++++ sysdeps/loongarch/start.S | 14 ++++++++++--- 3 files changed, 62 insertions(+), 3 deletions(-) diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure index 43b54d4965..7e671241a8 100644 --- a/sysdeps/loongarch/configure +++ b/sysdeps/loongarch/configure @@ -3,3 +3,40 @@ $as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC is sufficient to build static PIE on LoongArch" >&5 +$as_echo_n "checking if $CC is sufficient to build static PIE on LoongArch... " >&6; } +if ${libc_cv_static_pie_on_loongarch+:} false; then : + $as_echo_n "(cached) " >&6 +else + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#if !defined __GNUC__ || __GNUC__ < 13 +#error insufficient compiler for static PIE on LoongArch +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + libc_cv_static_pie_on_loongarch=yes +else + libc_cv_static_pie_on_loongarch=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_static_pie_on_loongarch" >&5 +$as_echo "$libc_cv_static_pie_on_loongarch" >&6; } +if test "$libc_cv_static_pie_on_loongarch" = yes; then + $as_echo "#define SUPPORT_STATIC_PIE 1" >>confdefs.h + +fi diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac index f744367bf3..624897bfb3 100644 --- a/sysdeps/loongarch/configure.ac +++ b/sysdeps/loongarch/configure.ac @@ -4,3 +4,17 @@ GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory. dnl It is always possible to access static and hidden symbols in an dnl position independent way. AC_DEFINE(HIDDEN_VAR_NEEDS_DYNAMIC_RELOC) + +dnl test if GCC is new enough for static PIE. +AC_CACHE_CHECK([if $CC is sufficient to build static PIE on LoongArch], +libc_cv_static_pie_on_loongarch, [ +AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[]], [[ +#if !defined __GNUC__ || __GNUC__ < 13 +#error insufficient compiler for static PIE on LoongArch +#endif +]])], + [libc_cv_static_pie_on_loongarch=yes], + [libc_cv_static_pie_on_loongarch=no])]) +if test "$libc_cv_static_pie_on_loongarch" = yes; then + AC_DEFINE(SUPPORT_STATIC_PIE) +fi diff --git a/sysdeps/loongarch/start.S b/sysdeps/loongarch/start.S index e66af16d57..05cabd9b96 100644 --- a/sysdeps/loongarch/start.S +++ b/sysdeps/loongarch/start.S @@ -60,9 +60,17 @@ ENTRY (ENTRY_POINT) cfi_undefined (1) or a5, a0, zero /* rtld_fini */ +#if defined(PIC) && !defined(SHARED) +/* For static PIE, the GOT cannot be used in _start because the GOT entries are + offsets instead of real addresses before __libc_start_main. */ +# define LA la.pcrel +#else /* We must get symbol main through GOT table, since main may not be local. For instance: googletest defines main in dynamic library. */ - la.got a0, t0, main +# define LA la.got +#endif + + LA a0, t0, main REG_L a1, sp, 0 ADDI a2, sp, SZREG @@ -73,9 +81,9 @@ ENTRY (ENTRY_POINT) move a4, zero /* used to be fini */ or a6, sp, zero /* stack_end */ - la.got ra, t0, __libc_start_main + LA ra, t0, __libc_start_main jirl ra, ra, 0 - la.got ra, t0, abort + LA ra, t0, abort jirl ra, ra, 0 END (ENTRY_POINT) -- 2.37.0