PING^5 https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html
On Sat, Sep 4, 2021 at 12:11 PM Fāng-ruì Sòng <mask...@google.com> wrote: > > PING^4 https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html > > One major design goal of PIE was to avoid copy relocations. > The original patch for GCC 5 caused problems for many years. > > On Wed, Aug 18, 2021 at 11:54 PM Fāng-ruì Sòng <mask...@google.com> wrote: >> >> 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 <mask...@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 <mask...@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 <mask...@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 >> > > > >> > > >> > > >> > > -- >> > > 宋方睿 >> > >> > >> > >> > -- >> > 宋方睿 >> >> >> >> -- >> 宋方睿 > > > > -- > 宋方睿 -- 宋方睿