From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from loongson.cn (mail.loongson.cn [114.242.206.163]) by sourceware.org (Postfix) with ESMTP id E73EB3858C74 for ; Thu, 29 Sep 2022 13:32:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E73EB3858C74 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=loongson.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=loongson.cn Received: from [10.20.4.187] (unknown [10.20.4.187]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Cx9OFunjVjotQjAA--.1184S3; Thu, 29 Sep 2022 21:32:30 +0800 (CST) Subject: Re: [PATCH v3 1/1] LoongArch: Add static PIE support To: Xi Ruoyao , libc-alpha@sourceware.org Cc: liuzhensong , Lulu Cheng , Wang Xuerui , Chenghua Xu References: <20220924074534.1566173-1-xry111@xry111.site> <20220924074534.1566173-2-xry111@xry111.site> From: caiyinyu Message-ID: Date: Thu, 29 Sep 2022 21:32:30 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20220924074534.1566173-2-xry111@xry111.site> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-CM-TRANSID:AQAAf8Cx9OFunjVjotQjAA--.1184S3 X-Coremail-Antispam: 1UD129KBjvJXoWxtF17tr4ktFW8Aw1fXr43ZFb_yoWxCFy3pr W7Zr98tF4xG3WfGrsIk3yYgFn5Ars7Cry7Aa13Cw48CFnFyr1rZr4fJrZIqa1UX34rJ340 vF1rK3WUGa1DJa7anT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvF14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26r1j6r1xM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4j 6F4UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s 0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xII jxv20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr 1lF7xvr2IY64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7Mxk0xIA0c2IEe2xFo4CEbIxv r21lc2xSY4AK6svPMxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I 0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWU AVWUtwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcV CY1x0267AKxVWUJVW8JwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAF wI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVWUJVW8JbIYCTnIWIevJa73UjIFyTuYvj fUoOJ5UUUUU X-CM-SenderInfo: 5fdl5xhq1xqz5rrqw2lrqou0/ X-Spam-Status: No, score=-14.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,KAM_DMARC_STATUS,NICE_REPLY_A,SPF_HELO_PASS,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 List-Id: 在 2022/9/24 下午3:45, Xi Ruoyao 写道: > 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 | 48 ++++++++++++++++++++++++++++++++++ > sysdeps/loongarch/configure.ac | 36 +++++++++++++++++++++++++ > sysdeps/loongarch/start.S | 14 +++++++--- > 3 files changed, 95 insertions(+), 3 deletions(-) > > diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure > index 43b54d4965..70d6fec5c1 100644 > --- a/sysdeps/loongarch/configure > +++ b/sysdeps/loongarch/configure > @@ -3,3 +3,51 @@ > > $as_echo "#define HIDDEN_VAR_NEEDS_DYNAMIC_RELOC 1" >>confdefs.h > > + > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the toolchain is sufficient to build static PIE on LoongArch" >&5 > +$as_echo_n "checking if the toolchain 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.S << EOF > +.global _start > +.type _start, @function > +_start: > + li.w $a7, 93 > + /* This ensures the assembler supports explicit reloc. */ > + pcalau12i $a0, %pc_hi20(x) > + ld.w $a0, $a0, %pc_lo12(x) > + syscall 0 > + > +.data > +x: > + .word 0 > + /* This should produce an R_LARCH_RELATIVE in the static PIE. */ > + .dword _start > +EOF > + libc_cv_static_pie_on_loongarch=no > + if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.S' > + { { 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..282b95b0fb 100644 > --- a/sysdeps/loongarch/configure.ac > +++ b/sysdeps/loongarch/configure.ac > @@ -4,3 +4,39 @@ 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 the toolchain is new enough for static PIE. > +dnl We need a GAS supporting explicit reloc (older GAS produces stack-based > +dnl reloc and triggers an internal error in the linker). And, we need GCC to > +dnl pass the correct linker flags for static PIE. GCC >= 13 and GAS >= 2.40 > +dnl satisify the requirement, but a distro may backport static PIE support into > +dnl earlier GCC or Binutils releases as well. > +AC_CACHE_CHECK([if the toolchain is sufficient to build static PIE on LoongArch], > +libc_cv_static_pie_on_loongarch, [ > + cat > conftest.S << EOF > +.global _start > +.type _start, @function > +_start: > + li.w $a7, 93 > + /* This ensures the assembler supports explicit reloc. */ > + pcalau12i $a0, %pc_hi20(x) > + ld.w $a0, $a0, %pc_lo12(x) > + syscall 0 > + > +.data > +x: > + .word 0 Tested on LoongArch machine with latest gcc and binutils (master): gcc 13 fa4bc21bac70df5ae5712a1933a2e6bb5bf8d42b binutils 2.39 4f56cf059ca883ca86c8f15cfc8a3e27465bf4b0 linux kernel 5.19 All passed. Here are some mistakes: diff --git a/sysdeps/loongarch/configure b/sysdeps/loongarch/configure index 70d6fec5c1..6edd6d08a5 100644 --- a/sysdeps/loongarch/configure +++ b/sysdeps/loongarch/configure @@ -14,10 +14,10 @@ else  .global _start  .type _start, @function  _start: -  li.w $a7, 93 +  li.w \$a7, 93    /* This ensures the assembler supports explicit reloc.  */ -  pcalau12i $a0, %pc_hi20(x) -  ld.w $a0, $a0, %pc_lo12(x) +  pcalau12i \$a0, %pc_hi20(x) +  ld.w \$a0, \$a0, %pc_lo12(x)    syscall 0  .data diff --git a/sysdeps/loongarch/configure.ac b/sysdeps/loongarch/configure.ac index 282b95b0fb..a8a373bea3 100644 --- a/sysdeps/loongarch/configure.ac +++ b/sysdeps/loongarch/configure.ac @@ -17,10 +17,10 @@ libc_cv_static_pie_on_loongarch, [  .global _start  .type _start, @function  _start: -  li.w $a7, 93 +  li.w \$a7, 93    /* This ensures the assembler supports explicit reloc.  */ -  pcalau12i $a0, %pc_hi20(x) -  ld.w $a0, $a0, %pc_lo12(x) +  pcalau12i \$a0, %pc_hi20(x) +  ld.w \$a0, \$a0, %pc_lo12(x)    syscall 0  .data > + /* This should produce an R_LARCH_RELATIVE in the static PIE. */ > + .dword _start > +EOF > + libc_cv_static_pie_on_loongarch=no > + if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static-pie -nostdlib -fPIE -o conftest conftest.S]) \ > + && 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)