From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yb1-xb2f.google.com (mail-yb1-xb2f.google.com [IPv6:2607:f8b0:4864:20::b2f]) by sourceware.org (Postfix) with ESMTPS id 4F6CB3857801 for ; Mon, 24 May 2021 16:43:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 4F6CB3857801 Received: by mail-yb1-xb2f.google.com with SMTP id w1so27637412ybt.1 for ; Mon, 24 May 2021 09:43:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:content-transfer-encoding; bh=8zu98ag35aS9gj4/r7+OzJWRSMFPLpRBTOz8PwNjnRc=; b=BkTzm4CH3wf3TlgZXTt3A9Dchp02WeaPWr4pQupbyJnHPrb+Q7Zo5eegR3LBmJttWJ 28IDF6P2GvHeBu7yLPmJKUz9Bssyc9ptGEqw0h6ISaR+FBE00z663PjDUChBq6ogjGe2 1fK+Nev8wcvHlz/f1V143bRquOWmQfmIELC2ZrPYr6qnkT7JM+EwiVb+Azev5zclSh+H 5zuB+GCkoUi/iEENeGzwGyGDtHTFHdVCp1+xfzqMICsK5NmgNPEPv7luIoleiToZt0ei OYvpRjIusmNO26Bb8B1JbZQkVV9xTp+djKdjqsV3/ipNakarSUFB6pNz7/OJTHvb0ZPa wP8g== X-Gm-Message-State: AOAM533bPlOfwCzXlOKhN28J1t90hvtXC1fTjViomcNlPjzciJ0n37f4 WBz6iWeTQ8RHoSBBuBRYF5zv+JQjBEqbz+AIP2heS9K6ijCf+Q== X-Google-Smtp-Source: ABdhPJwo4rtEjDj1Y7uvCEpxbQjx3F5Jg/omodWmQicy2xgDve1o4sAwlVTDkiIUwAMWMaBHWLwAKkxsg6RYU6tB+3I= X-Received: by 2002:a25:3bd7:: with SMTP id i206mr37955383yba.106.1621874597004; Mon, 24 May 2021 09:43:17 -0700 (PDT) MIME-Version: 1.0 References: <20210512032905.1612080-1-maskray@google.com> In-Reply-To: <20210512032905.1612080-1-maskray@google.com> From: =?UTF-8?B?RsSBbmctcnXDrCBTw7JuZw==?= Date: Mon, 24 May 2021 09:43:06 -0700 Message-ID: Subject: Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC To: GCC Patches , Jan Hubicka , Florian Weimer , "H.J. Lu" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-22.0 required=5.0 tests=BAYES_00, BODY_8BITS, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, ENV_AND_HDR_SPF_MATCH, GIT_PATCH_0, KAM_SHORT, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, USER_IN_DEF_DKIM_WL, USER_IN_DEF_SPF_WL autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 24 May 2021 16:43:21 -0000 Ping https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html On Tue, May 11, 2021 at 8:29 PM Fangrui Song wrote: > > This was introduced in 2014-12 to use local binding for external symbols > for -fPIE. Now that we have H.J. Lu's GOTPCRELX for years which mostly > nullify the benefit of HAVE_LD_PIE_COPYRELOC, HAVE_LD_PIE_COPYRELOC > should retire now. > > One design goal of -fPIE was to avoid copy relocations. > HAVE_LD_PIE_COPYRELOC has deviated from the goal. With this change, the > -fPIE behavior of x86-64 will be closer to x86-32 and other targets. > > --- > > See https://gcc.gnu.org/legacy-ml/gcc/2019-05/msg00215.html for a list > of fixed and unfixed (e.g. gold incompatibility with protected > https://sourceware.org/bugzilla/show_bug.cgi?id=3D19823) issues. > > If you prefer a longer write-up, see > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries= -and-protected > --- > gcc/config.in | 6 --- > gcc/config/i386/i386.c | 11 +--- > gcc/configure | 52 ------------------- > gcc/configure.ac | 48 ----------------- > gcc/doc/sourcebuild.texi | 3 -- > .../gcc.target/i386/pie-copyrelocs-1.c | 14 ----- > .../gcc.target/i386/pie-copyrelocs-2.c | 14 ----- > .../gcc.target/i386/pie-copyrelocs-3.c | 14 ----- > .../gcc.target/i386/pie-copyrelocs-4.c | 17 ------ > gcc/testsuite/lib/target-supports.exp | 47 ----------------- > 10 files changed, 2 insertions(+), 224 deletions(-) > delete mode 100644 gcc/testsuite/gcc.target/i386/pie-copyrelocs-1.c > delete mode 100644 gcc/testsuite/gcc.target/i386/pie-copyrelocs-2.c > delete mode 100644 gcc/testsuite/gcc.target/i386/pie-copyrelocs-3.c > delete mode 100644 gcc/testsuite/gcc.target/i386/pie-copyrelocs-4.c > > diff --git a/gcc/config.in b/gcc/config.in > index e54f59ce0c3..a65bf5d4176 100644 > --- a/gcc/config.in > +++ b/gcc/config.in > @@ -1659,12 +1659,6 @@ > #endif > > > -/* Define 0/1 if your linker supports -pie option with copy reloc. */ > -#ifndef USED_FOR_TARGET > -#undef HAVE_LD_PIE_COPYRELOC > -#endif > - > - > /* Define if your PowerPC linker has .gnu.attributes long double support= . */ > #ifndef USED_FOR_TARGET > #undef HAVE_LD_PPC_GNU_ATTR_LONG_DOUBLE > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 915f89f571a..5ec3c6fd0c9 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -10579,11 +10579,7 @@ legitimate_pic_address_disp_p (rtx disp) > return true; > } > else if (!SYMBOL_REF_FAR_ADDR_P (op0) > - && (SYMBOL_REF_LOCAL_P (op0) > - || (HAVE_LD_PIE_COPYRELOC > - && flag_pie > - && !SYMBOL_REF_WEAK (op0) > - && !SYMBOL_REF_FUNCTION_P (op0))) > + && SYMBOL_REF_LOCAL_P (op0) > && ix86_cmodel !=3D CM_LARGE_PIC) > return true; > break; > @@ -22892,10 +22888,7 @@ ix86_atomic_assign_expand_fenv (tree *hold, tree= *clear, tree *update) > static bool > ix86_binds_local_p (const_tree exp) > { > - return default_binds_local_p_3 (exp, flag_shlib !=3D 0, true, true, > - (!flag_pic > - || (TARGET_64BIT > - && HAVE_LD_PIE_COPYRELOC !=3D 0)))= ; > + return default_binds_local_p_3 (exp, flag_shlib !=3D 0, true, true, !f= lag_pic); > } > #endif > > diff --git a/gcc/configure b/gcc/configure > index f03fe888384..c500f5ca11e 100755 > --- a/gcc/configure > +++ b/gcc/configure > @@ -29968,58 +29968,6 @@ fi > { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_pie" >&5 > $as_echo "$gcc_cv_ld_pie" >&6; } > > -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking linker PIE support wit= h copy reloc" >&5 > -$as_echo_n "checking linker PIE support with copy reloc... " >&6; } > -gcc_cv_ld_pie_copyreloc=3Dno > -if test $gcc_cv_ld_pie =3D yes ; then > - if test $in_tree_ld =3D yes ; then > - if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_vers= ion" -ge 25 -o "$gcc_cv_gld_major_version" -gt 2; then > - gcc_cv_ld_pie_copyreloc=3Dyes > - fi > - elif test x$gcc_cv_as !=3D x -a x$gcc_cv_ld !=3D x ; then > - # Check if linker supports -pie option with copy reloc > - case "$target" in > - i?86-*-linux* | x86_64-*-linux*) > - cat > conftest1.s < - .globl a_glob > - .data > - .type a_glob, @object > - .size a_glob, 4 > -a_glob: > - .long 2 > -EOF > - cat > conftest2.s < - .text > - .globl main > - .type main, @function > -main: > - movl %eax, a_glob(%rip) > - .size main, .-main > - .globl ptr > - .section .data.rel,"aw",@progbits > - .type ptr, @object > -ptr: > - .quad a_glob > -EOF > - if $gcc_cv_as --64 -o conftest1.o conftest1.s > /dev/null 2>&1 \ > - && $gcc_cv_ld -shared -melf_x86_64 -o conftest1.so conftest1.o = > /dev/null 2>&1 \ > - && $gcc_cv_as --64 -o conftest2.o conftest2.s > /dev/null 2>&1 = \ > - && $gcc_cv_ld -pie -melf_x86_64 -o conftest conftest2.o conftes= t1.so > /dev/null 2>&1; then > - gcc_cv_ld_pie_copyreloc=3Dyes > - fi > - rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s co= nftest2.s > - ;; > - esac > - fi > -fi > - > -cat >>confdefs.h <<_ACEOF > -#define HAVE_LD_PIE_COPYRELOC `if test x"$gcc_cv_ld_pie_copyreloc" =3D x= yes; then echo 1; else echo 0; fi` > -_ACEOF > - > -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_pie_copyrelo= c" >&5 > -$as_echo "$gcc_cv_ld_pie_copyreloc" >&6; } > - > { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker EH-compatible g= arbage collection of sections" >&5 > $as_echo_n "checking linker EH-compatible garbage collection of sections= ... " >&6; } > gcc_cv_ld_eh_gc_sections=3Dno > diff --git a/gcc/configure.ac b/gcc/configure.ac > index e9ba2af548a..d60b22c1708 100644 > --- a/gcc/configure.ac > +++ b/gcc/configure.ac > @@ -5924,54 +5924,6 @@ if test x"$gcc_cv_ld_pie" =3D xyes; then > fi > AC_MSG_RESULT($gcc_cv_ld_pie) > > -AC_MSG_CHECKING(linker PIE support with copy reloc) > -gcc_cv_ld_pie_copyreloc=3Dno > -if test $gcc_cv_ld_pie =3D yes ; then > - if test $in_tree_ld =3D yes ; then > - if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_vers= ion" -ge 25 -o "$gcc_cv_gld_major_version" -gt 2; then > - gcc_cv_ld_pie_copyreloc=3Dyes > - fi > - elif test x$gcc_cv_as !=3D x -a x$gcc_cv_ld !=3D x ; then > - # Check if linker supports -pie option with copy reloc > - case "$target" in > - i?86-*-linux* | x86_64-*-linux*) > - cat > conftest1.s < - .globl a_glob > - .data > - .type a_glob, @object > - .size a_glob, 4 > -a_glob: > - .long 2 > -EOF > - cat > conftest2.s < - .text > - .globl main > - .type main, @function > -main: > - movl %eax, a_glob(%rip) > - .size main, .-main > - .globl ptr > - .section .data.rel,"aw",@progbits > - .type ptr, @object > -ptr: > - .quad a_glob > -EOF > - if $gcc_cv_as --64 -o conftest1.o conftest1.s > /dev/null 2>&1 \ > - && $gcc_cv_ld -shared -melf_x86_64 -o conftest1.so conftest1.o = > /dev/null 2>&1 \ > - && $gcc_cv_as --64 -o conftest2.o conftest2.s > /dev/null 2>&1 = \ > - && $gcc_cv_ld -pie -melf_x86_64 -o conftest conftest2.o conftes= t1.so > /dev/null 2>&1; then > - gcc_cv_ld_pie_copyreloc=3Dyes > - fi > - rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s co= nftest2.s > - ;; > - esac > - fi > -fi > -AC_DEFINE_UNQUOTED(HAVE_LD_PIE_COPYRELOC, > - [`if test x"$gcc_cv_ld_pie_copyreloc" =3D xyes; then echo 1; else echo= 0; fi`], > - [Define 0/1 if your linker supports -pie option with copy reloc.]) > -AC_MSG_RESULT($gcc_cv_ld_pie_copyreloc) > - > AC_MSG_CHECKING(linker EH-compatible garbage collection of sections) > gcc_cv_ld_eh_gc_sections=3Dno > if test $in_tree_ld =3D yes ; then > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi > index 3a1d6536833..1c8019ea04c 100644 > --- a/gcc/doc/sourcebuild.texi > +++ b/gcc/doc/sourcebuild.texi > @@ -2383,9 +2383,6 @@ Target supports FPU instructions. > @item non_strict_align > Target does not require strict alignment. > > -@item pie_copyreloc > -The x86-64 target linker supports PIE with copy reloc. > - > @item rdrand > Target supports x86 @code{rdrand} instruction. > > diff --git a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-1.c b/gcc/tests= uite/gcc.target/i386/pie-copyrelocs-1.c > deleted file mode 100644 > index 7af851bde9b..00000000000 > --- a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-1.c > +++ /dev/null > @@ -1,14 +0,0 @@ > -/* Check that GOTPCREL isn't used to access glob_a. */ > -/* { dg-do compile { target *-*-linux* } } */ > -/* { dg-require-effective-target pie_copyreloc } */ > -/* { dg-options "-O2 -fpie" } */ > - > -extern int glob_a; > - > -int foo () > -{ > - return glob_a; > -} > - > -/* glob_a should never be accessed with a GOTPCREL. */ > -/* { dg-final { scan-assembler-not "glob_a@GOTPCREL" { target { ! ia32 }= } } } */ > diff --git a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-2.c b/gcc/tests= uite/gcc.target/i386/pie-copyrelocs-2.c > deleted file mode 100644 > index 19cb97e882c..00000000000 > --- a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-2.c > +++ /dev/null > @@ -1,14 +0,0 @@ > -/* Check that GOTPCREL isn't used to access glob_a. */ > -/* { dg-do compile { target *-*-linux* } } */ > -/* { dg-require-effective-target pie_copyreloc } */ > -/* { dg-options "-O2 -fpie" } */ > - > -int glob_a; > - > -int foo () > -{ > - return glob_a; > -} > - > -/* glob_a should never be accessed with a GOTPCREL. */ > -/* { dg-final { scan-assembler-not "glob_a@GOTPCREL" { target { ! ia32 }= } } } */ > diff --git a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-3.c b/gcc/tests= uite/gcc.target/i386/pie-copyrelocs-3.c > deleted file mode 100644 > index c2fa8968e77..00000000000 > --- a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-3.c > +++ /dev/null > @@ -1,14 +0,0 @@ > -/* Check that PLT is used to access glob_a. */ > -/* { dg-do compile { target *-*-linux* } } */ > -/* { dg-require-effective-target pie_copyreloc } */ > -/* { dg-options "-O2 -fpie" } */ > - > -extern int glob_a (void); > - > -int foo () > -{ > - return glob_a (); > -} > - > -/* glob_a should be accessed with a PLT. */ > -/* { dg-final { scan-assembler "glob_a@PLT" { target { ! ia32 } } } } */ > diff --git a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-4.c b/gcc/tests= uite/gcc.target/i386/pie-copyrelocs-4.c > deleted file mode 100644 > index 413cdf381c3..00000000000 > --- a/gcc/testsuite/gcc.target/i386/pie-copyrelocs-4.c > +++ /dev/null > @@ -1,17 +0,0 @@ > -/* Check that GOTPCREL is used to access glob_a. */ > -/* { dg-do compile { target *-*-linux* } } */ > -/* { dg-require-effective-target pie_copyreloc } */ > -/* { dg-options "-O2 -fpie" } */ > - > -extern int glob_a __attribute__((weak)); > - > -int foo () > -{ > - if (&glob_a !=3D 0) > - return glob_a; > - else > - return 0; > -} > - > -/* weak glob_a should be accessed with a GOTPCREL. */ > -/* { dg-final { scan-assembler "glob_a@GOTPCREL" { target { ! ia32 } } }= } */ > diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/ta= rget-supports.exp > index 5700c231065..6f922ebf2ab 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -10133,53 +10133,6 @@ proc scan-ltrans-tree-dump-dem-not_required_opti= ons {} { > return "-flto-partition=3Done" > } > > -# Return 1 if the x86-64 target supports PIE with copy reloc, 0 > -# otherwise. Cache the result. > - > -proc check_effective_target_pie_copyreloc { } { > - global tool > - global GCC_UNDER_TEST > - > - if { !([istarget i?86-*-*] || [istarget x86_64-*-*]) } { > - return 0 > - } > - > - # Need auto-host.h to check linker support. > - if { ![file exists ../../auto-host.h ] } { > - return 0 > - } > - > - return [check_cached_effective_target pie_copyreloc { > - # Set up and compile to see if linker supports PIE with copy > - # reloc. Include the current process ID in the file names to > - # prevent conflicts with invocations for multiple testsuites. > - > - set src pie[pid].c > - set obj pie[pid].o > - > - set f [open $src "w"] > - puts $f "#include \"../../auto-host.h\"" > - puts $f "#if HAVE_LD_PIE_COPYRELOC =3D=3D 0" > - puts $f "# error Linker does not support PIE with copy reloc." > - puts $f "#endif" > - close $f > - > - verbose "check_effective_target_pie_copyreloc compiling testfile = $src" 2 > - set lines [${tool}_target_compile $src $obj object ""] > - > - file delete $src > - file delete $obj > - > - if [string match "" $lines] then { > - verbose "check_effective_target_pie_copyreloc testfile compil= ation passed" 2 > - return 1 > - } else { > - verbose "check_effective_target_pie_copyreloc testfile compil= ation failed" 2 > - return 0 > - } > - }] > -} > - > # Return 1 if the x86 target supports R_386_GOT32X relocation, 0 > # otherwise. Cache the result. > > -- > 2.31.1.607.g51e8a6a459-goog > --=20 =E5=AE=8B=E6=96=B9=E7=9D=BF