From: "Fāng-ruì Sòng" <maskray@google.com>
To: GCC Patches <gcc-patches@gcc.gnu.org>, Jan Hubicka <jh@suse.cz>,
Florian Weimer <fweimer@redhat.com>,
"H.J. Lu" <hjl.tools@gmail.com>
Subject: Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
Date: Wed, 18 Aug 2021 23:54:23 -0700 [thread overview]
Message-ID: <CAFP8O3LMaHXvLNwj3oPFcJ7R4hXZomaLSeX2UhCU9Qgf_CkfLw@mail.gmail.com> (raw)
In-Reply-To: <CAFP8O3LjRTFcjnKUcFUUQnXrji2zmMUd-vXttaoW=VHiqgZkuA@mail.gmail.com>
PING^3 https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html
On Fri, Jun 4, 2021 at 3:04 PM Fāng-ruì Sòng <maskray@google.com> wrote:
>
> PING^2 https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html
>
> On Mon, May 24, 2021 at 9:43 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> >
> > Ping https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html
> >
> > On Tue, May 11, 2021 at 8:29 PM Fangrui Song <maskray@google.com> 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=19823) 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 != 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 != 0, true, true,
> > > - (!flag_pic
> > > - || (TARGET_64BIT
> > > - && HAVE_LD_PIE_COPYRELOC != 0)));
> > > + return default_binds_local_p_3 (exp, flag_shlib != 0, true, true, !flag_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 with copy reloc" >&5
> > > -$as_echo_n "checking linker PIE support with copy reloc... " >&6; }
> > > -gcc_cv_ld_pie_copyreloc=no
> > > -if test $gcc_cv_ld_pie = yes ; then
> > > - if test $in_tree_ld = yes ; then
> > > - if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 25 -o "$gcc_cv_gld_major_version" -gt 2; then
> > > - gcc_cv_ld_pie_copyreloc=yes
> > > - fi
> > > - elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x ; then
> > > - # Check if linker supports -pie option with copy reloc
> > > - case "$target" in
> > > - i?86-*-linux* | x86_64-*-linux*)
> > > - cat > conftest1.s <<EOF
> > > - .globl a_glob
> > > - .data
> > > - .type a_glob, @object
> > > - .size a_glob, 4
> > > -a_glob:
> > > - .long 2
> > > -EOF
> > > - cat > conftest2.s <<EOF
> > > - .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 conftest1.so > /dev/null 2>&1; then
> > > - gcc_cv_ld_pie_copyreloc=yes
> > > - fi
> > > - rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
> > > - ;;
> > > - esac
> > > - fi
> > > -fi
> > > -
> > > -cat >>confdefs.h <<_ACEOF
> > > -#define HAVE_LD_PIE_COPYRELOC `if test x"$gcc_cv_ld_pie_copyreloc" = xyes; then echo 1; else echo 0; fi`
> > > -_ACEOF
> > > -
> > > -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_ld_pie_copyreloc" >&5
> > > -$as_echo "$gcc_cv_ld_pie_copyreloc" >&6; }
> > > -
> > > { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker EH-compatible garbage collection of sections" >&5
> > > $as_echo_n "checking linker EH-compatible garbage collection of sections... " >&6; }
> > > gcc_cv_ld_eh_gc_sections=no
> > > 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" = xyes; then
> > > fi
> > > AC_MSG_RESULT($gcc_cv_ld_pie)
> > >
> > > -AC_MSG_CHECKING(linker PIE support with copy reloc)
> > > -gcc_cv_ld_pie_copyreloc=no
> > > -if test $gcc_cv_ld_pie = yes ; then
> > > - if test $in_tree_ld = yes ; then
> > > - if test "$gcc_cv_gld_major_version" -eq 2 -a "$gcc_cv_gld_minor_version" -ge 25 -o "$gcc_cv_gld_major_version" -gt 2; then
> > > - gcc_cv_ld_pie_copyreloc=yes
> > > - fi
> > > - elif test x$gcc_cv_as != x -a x$gcc_cv_ld != x ; then
> > > - # Check if linker supports -pie option with copy reloc
> > > - case "$target" in
> > > - i?86-*-linux* | x86_64-*-linux*)
> > > - cat > conftest1.s <<EOF
> > > - .globl a_glob
> > > - .data
> > > - .type a_glob, @object
> > > - .size a_glob, 4
> > > -a_glob:
> > > - .long 2
> > > -EOF
> > > - cat > conftest2.s <<EOF
> > > - .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 conftest1.so > /dev/null 2>&1; then
> > > - gcc_cv_ld_pie_copyreloc=yes
> > > - fi
> > > - rm -f conftest conftest1.so conftest1.o conftest2.o conftest1.s conftest2.s
> > > - ;;
> > > - esac
> > > - fi
> > > -fi
> > > -AC_DEFINE_UNQUOTED(HAVE_LD_PIE_COPYRELOC,
> > > - [`if test x"$gcc_cv_ld_pie_copyreloc" = 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=no
> > > if test $in_tree_ld = 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/testsuite/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/testsuite/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/testsuite/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/testsuite/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 != 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/target-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_options {} {
> > > return "-flto-partition=one"
> > > }
> > >
> > > -# 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 == 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 compilation passed" 2
> > > - return 1
> > > - } else {
> > > - verbose "check_effective_target_pie_copyreloc testfile compilation 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
> > >
> >
> >
> > --
> > 宋方睿
>
>
>
> --
> 宋方睿
--
宋方睿
next prev parent reply other threads:[~2021-08-19 6:54 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-12 3:29 Fangrui Song
2021-05-12 5:27 ` Rainer Orth
2021-05-12 6:33 ` Fangrui Song
2021-05-24 16:43 ` Fāng-ruì Sòng
2021-06-04 22:04 ` Fāng-ruì Sòng
2021-08-19 6:54 ` Fāng-ruì Sòng [this message]
2021-09-04 19:11 ` Fāng-ruì Sòng
2021-09-20 18:19 ` Fāng-ruì Sòng
2021-09-21 16:16 ` Uros Bizjak
2021-09-22 1:56 ` H.J. Lu
2021-09-22 2:08 ` Fāng-ruì Sòng
2021-09-24 17:29 ` Fāng-ruì Sòng
2021-09-24 17:41 ` H.J. Lu
2021-09-24 18:14 ` Fāng-ruì Sòng
2021-09-24 18:29 ` H.J. Lu
2021-10-08 17:57 ` Fāng-ruì Sòng
2021-11-01 2:36 ` Fāng-ruì Sòng
2022-06-02 7:48 ` Fāng-ruì Sòng
2022-06-15 8:34 Fangrui Song
2022-06-21 3:51 ` Fangrui Song
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAFP8O3LMaHXvLNwj3oPFcJ7R4hXZomaLSeX2UhCU9Qgf_CkfLw@mail.gmail.com \
--to=maskray@google.com \
--cc=fweimer@redhat.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=hjl.tools@gmail.com \
--cc=jh@suse.cz \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).