x86-64: Remove HAVE_LD_PIE_COPYRELOC

Message ID 20220615083432.2721418-1-maskray@google.com
State New
Headers
Series x86-64: Remove HAVE_LD_PIE_COPYRELOC |

Commit Message

Fangrui Song June 15, 2022, 8:34 a.m. UTC
  This was introduced in 2014-12 to use local binding for external symbols
for -fPIE.  It avoids a GOT indirection but the same optimizationis
obtained with ld's R_X86_64_[REX_]GOTPCRELX optimization (albeit with
slightly longer code).

One design goal of -fPIE was to avoid copy relocations.
HAVE_LD_PIE_COPYRELOC has deviated from the goal.  By removing
HAVE_LD_PIE_COPYRELOC, the -fPIE behavior of x86-64 will match x86-32
and other targets.

The design goal of protected symbols was to improve performance similar
to -Bsymbolic.  lld rejects copy relocations on data symbols.  Latest
glibc rtld reports a warning when a protected data symbol is copy
relocated[1].  With the adoption of PIE most object files are -fPIE or
-fPIC.  -fPIE defaulting to the possibly copy relocations behavior makes
protected data symbols infeasible to adopt on x86-64.

[1]: https://sourceware.org/git/?p=glibc.git;a=commit;h=7374c02b683b7110b853a32496a619410364d70b
("elf: Refine direct extern access diagnostics to protected symbol")
---
 gcc/config.in                                 |  6 ---
 gcc/config/i386/i386.cc                       | 16 +-----
 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/gcc.target/i386/pr32219-9.c     |  1 -
 gcc/testsuite/lib/target-supports.exp         | 47 -----------------
 11 files changed, 2 insertions(+), 230 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
  

Comments

Fangrui Song June 21, 2022, 3:51 a.m. UTC | #1
On Wed, Jun 15, 2022 at 2:34 AM Fangrui Song <maskray@google.com> wrote:
>
> This was introduced in 2014-12 to use local binding for external symbols
> for -fPIE.  It avoids a GOT indirection but the same optimizationis
> obtained with ld's R_X86_64_[REX_]GOTPCRELX optimization (albeit with
> slightly longer code).
>
> One design goal of -fPIE was to avoid copy relocations.
> HAVE_LD_PIE_COPYRELOC has deviated from the goal.  By removing
> HAVE_LD_PIE_COPYRELOC, the -fPIE behavior of x86-64 will match x86-32
> and other targets.
>
> The design goal of protected symbols was to improve performance similar
> to -Bsymbolic.  lld rejects copy relocations on data symbols.  Latest
> glibc rtld reports a warning when a protected data symbol is copy
> relocated[1].  With the adoption of PIE most object files are -fPIE or
> -fPIC.  -fPIE defaulting to the possibly copy relocations behavior makes
> protected data symbols infeasible to adopt on x86-64.
>
> [1]: https://sourceware.org/git/?p=glibc.git;a=commit;h=7374c02b683b7110b853a32496a619410364d70b
> ("elf: Refine direct extern access diagnostics to protected symbol")
> ---
>  gcc/config.in                                 |  6 ---
>  gcc/config/i386/i386.cc                       | 16 +-----
>  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/gcc.target/i386/pr32219-9.c     |  1 -
>  gcc/testsuite/lib/target-supports.exp         | 47 -----------------
>  11 files changed, 2 insertions(+), 230 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 16bb963b45b..ade42625deb 100644
> --- a/gcc/config.in
> +++ b/gcc/config.in
> @@ -1691,12 +1691,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.cc b/gcc/config/i386/i386.cc
> index 3d189e124e4..f9fd9650f7c 100644
> --- a/gcc/config/i386/i386.cc
> +++ b/gcc/config/i386/i386.cc
> @@ -10790,16 +10790,7 @@ legitimate_pic_address_disp_p (rtx disp)
>                   || ix86_cmodel == CM_SMALL_PIC)
>                 return true;
>             }
> -         else if (!SYMBOL_REF_FAR_ADDR_P (op0)
> -                  && (SYMBOL_REF_LOCAL_P (op0)
> -                      || ((ix86_direct_extern_access
> -                           && !(SYMBOL_REF_DECL (op0)
> -                                && lookup_attribute ("nodirect_extern_access",
> -                                                     DECL_ATTRIBUTES (SYMBOL_REF_DECL (op0)))))
> -                          && HAVE_LD_PIE_COPYRELOC
> -                          && flag_pie
> -                          && !SYMBOL_REF_WEAK (op0)
> -                          && !SYMBOL_REF_FUNCTION_P (op0)))
> +         else if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
>                    && ix86_cmodel != CM_LARGE_PIC)
>             return true;
>           break;
> @@ -23815,10 +23806,7 @@ ix86_binds_local_p (const_tree exp)
>      ix86_has_no_direct_extern_access = true;
>    return default_binds_local_p_3 (exp, flag_shlib != 0, true,
>                                   direct_extern_access,
> -                                 (direct_extern_access
> -                                  && (!flag_pic
> -                                      || (TARGET_64BIT
> -                                          && HAVE_LD_PIE_COPYRELOC != 0))));
> +                                 (direct_extern_access && !flag_pic));
>  }
>
>  /* If flag_pic or ix86_direct_extern_access is false, then neither
> diff --git a/gcc/configure b/gcc/configure
> index f43dc989d02..bf8aaec6e05 100755
> --- a/gcc/configure
> +++ b/gcc/configure
> @@ -30081,58 +30081,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 80bdd8ceef9..11b61cd159d 100644
> --- a/gcc/configure.ac
> +++ b/gcc/configure.ac
> @@ -5983,54 +5983,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 606ab85a116..2f79e542efb 100644
> --- a/gcc/doc/sourcebuild.texi
> +++ b/gcc/doc/sourcebuild.texi
> @@ -2517,9 +2517,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/gcc.target/i386/pr32219-9.c b/gcc/testsuite/gcc.target/i386/pr32219-9.c
> index 8c218266359..4958957f5cb 100644
> --- a/gcc/testsuite/gcc.target/i386/pr32219-9.c
> +++ b/gcc/testsuite/gcc.target/i386/pr32219-9.c
> @@ -1,5 +1,4 @@
>  /* { dg-do compile { target *-*-linux* } } */
> -/* { dg-require-effective-target pie_copyreloc } */
>  /* { dg-options "-O2 -fpie" } */
>
>  /* Uninitialized common symbol with -fpie.  */
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index d1f4eb7641f..93c15eae051 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -10832,53 +10832,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.36.1.476.g0c4daa206d-goog
>
  

Patch

diff --git a/gcc/config.in b/gcc/config.in
index 16bb963b45b..ade42625deb 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -1691,12 +1691,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.cc b/gcc/config/i386/i386.cc
index 3d189e124e4..f9fd9650f7c 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -10790,16 +10790,7 @@  legitimate_pic_address_disp_p (rtx disp)
 		  || ix86_cmodel == CM_SMALL_PIC)
 		return true;
 	    }
-	  else if (!SYMBOL_REF_FAR_ADDR_P (op0)
-		   && (SYMBOL_REF_LOCAL_P (op0)
-		       || ((ix86_direct_extern_access
-			    && !(SYMBOL_REF_DECL (op0)
-				 && lookup_attribute ("nodirect_extern_access",
-						      DECL_ATTRIBUTES (SYMBOL_REF_DECL (op0)))))
-			   && HAVE_LD_PIE_COPYRELOC
-			   && flag_pie
-			   && !SYMBOL_REF_WEAK (op0)
-			   && !SYMBOL_REF_FUNCTION_P (op0)))
+	  else if (!SYMBOL_REF_FAR_ADDR_P (op0) && SYMBOL_REF_LOCAL_P (op0)
 		   && ix86_cmodel != CM_LARGE_PIC)
 	    return true;
 	  break;
@@ -23815,10 +23806,7 @@  ix86_binds_local_p (const_tree exp)
     ix86_has_no_direct_extern_access = true;
   return default_binds_local_p_3 (exp, flag_shlib != 0, true,
 				  direct_extern_access,
-				  (direct_extern_access
-				   && (!flag_pic
-				       || (TARGET_64BIT
-					   && HAVE_LD_PIE_COPYRELOC != 0))));
+				  (direct_extern_access && !flag_pic));
 }
 
 /* If flag_pic or ix86_direct_extern_access is false, then neither
diff --git a/gcc/configure b/gcc/configure
index f43dc989d02..bf8aaec6e05 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -30081,58 +30081,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 80bdd8ceef9..11b61cd159d 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -5983,54 +5983,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 606ab85a116..2f79e542efb 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2517,9 +2517,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/gcc.target/i386/pr32219-9.c b/gcc/testsuite/gcc.target/i386/pr32219-9.c
index 8c218266359..4958957f5cb 100644
--- a/gcc/testsuite/gcc.target/i386/pr32219-9.c
+++ b/gcc/testsuite/gcc.target/i386/pr32219-9.c
@@ -1,5 +1,4 @@ 
 /* { dg-do compile { target *-*-linux* } } */
-/* { dg-require-effective-target pie_copyreloc } */
 /* { dg-options "-O2 -fpie" } */
 
 /* Uninitialized common symbol with -fpie.  */
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index d1f4eb7641f..93c15eae051 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -10832,53 +10832,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.