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

Reply via email to