From patchwork Fri Sep 23 11:16:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xi Ruoyao X-Patchwork-Id: 1681519 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=sourceware.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=sourceware.org; envelope-from=libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=WF4WxQFC; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-384) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4MYqPQ1Xrsz1yqH for ; Fri, 23 Sep 2022 21:17:30 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 22448385783E for ; Fri, 23 Sep 2022 11:17:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 22448385783E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1663931848; bh=WwAwhksvmVDYF952BVHzm2vcz1t+CGYtLi92srD0cNk=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=WF4WxQFCZ2gw4M9ssn4JIcvypP1sYcX7FLgUaN2wJozNvWzH+1ANKmovJDdDJ9T8R ztTvIahlJTucDWrp0pKobrjleMxJnt8yznJaAY9US+4jumE4jp3NUTfIhtimh5jglX Sa2u8ksW10X+B1oQRufPTzCFDru1n65I+IDveAlY= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from xry111.site (xry111.site [IPv6:2001:470:683e::1]) by sourceware.org (Postfix) with ESMTPS id 4ADE1385828B for ; Fri, 23 Sep 2022 11:17:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 4ADE1385828B Received: from xry111-x57s1.. (unknown [IPv6:240e:358:11af:2800: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 E2C2665EB6; Fri, 23 Sep 2022 07:17:04 -0400 (EDT) To: libc-alpha@sourceware.org Subject: [PATCH v2 1/1] LoongArch: Add static PIE support Date: Fri, 23 Sep 2022 19:16:47 +0800 Message-Id: <20220923111647.48303-2-xry111@xry111.site> X-Mailer: git-send-email 2.37.3 In-Reply-To: <20220923111647.48303-1-xry111@xry111.site> References: <20220923111647.48303-1-xry111@xry111.site> MIME-Version: 1.0 X-Spam-Status: No, score=-8.6 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 X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Xi Ruoyao via Libc-alpha From: Xi Ruoyao Reply-To: Xi Ruoyao Cc: caiyinyu , Chenghua Xu , liuzhensong , Lulu Cheng , Wang Xuerui Errors-To: libc-alpha-bounces+incoming=patchwork.ozlabs.org@sourceware.org Sender: "Libc-alpha" 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 | 20 ++++++++++++++++++ sysdeps/loongarch/start.S | 14 ++++++++++--- 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure index 43b54d4965..4c1dd303bf 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 the compiler is sufficient to build static PIE on LoongArch" >&5 +$as_echo_n "checking if the compiler 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 > conftest.c << EOF +extern int x __asm__("y"); +int y; +void *_start() { return &x; } +EOF + libc_cv_static_pie_on_loongarch=no + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.c' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } \ + && { ac_try='LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 + (eval $ac_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; } + then + libc_cv_static_pie_on_loongarch=yes + fi + rm -rf conftest.* +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..f389679459 100644 --- a/sysdeps/loongarch/configure.ac +++ b/sysdeps/loongarch/configure.ac @@ -4,3 +4,23 @@ 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 the compiler is sufficient to build static PIE on LoongArch], +libc_cv_static_pie_on_loongarch, [ + cat > conftest.c << EOF +extern int x __asm__("y"); +int y; +void *_start() { return &x; } +EOF + libc_cv_static_pie_on_loongarch=no + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.c]) \ + && AC_TRY_COMMAND([LC_ALL=C $READELF -Wr conftest | grep -q R_LARCH_RELATIVE]) + then + libc_cv_static_pie_on_loongarch=yes + fi + rm -rf conftest.*]) + +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)