[PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
Fangrui Song
maskray@google.com
Wed Jun 15 08:34:32 GMT 2022
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
More information about the Gcc-patches
mailing list