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
>> > > >
>> > >
>> > >
>> > > --
>> > > 宋方睿
>> >
>> >
>> >
>> > --
>> > 宋方睿
>>
>>
>>
>> --
>> 宋方睿
>
>
>
> --
> 宋方睿



-- 
宋方睿

Reply via email to