On Wed, Jun 15, 2022 at 2:34 AM Fangrui Song <mask...@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 >
-- 宋方睿