public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
@ 2021-05-12  3:29 Fangrui Song
  2021-05-12  5:27 ` Rainer Orth
  2021-05-24 16:43 ` Fāng-ruì Sòng
  0 siblings, 2 replies; 20+ messages in thread
From: Fangrui Song @ 2021-05-12  3:29 UTC (permalink / raw)
  To: gcc-patches, Jan Hubicka, Florian Weimer, H.J. Lu

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


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-05-12  3:29 [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC Fangrui Song
@ 2021-05-12  5:27 ` Rainer Orth
  2021-05-12  6:33   ` Fangrui Song
  2021-05-24 16:43 ` Fāng-ruì Sòng
  1 sibling, 1 reply; 20+ messages in thread
From: Rainer Orth @ 2021-05-12  5:27 UTC (permalink / raw)
  To: Fangrui Song via Gcc-patches
  Cc: Jan Hubicka, Florian Weimer, H.J. Lu, Fangrui Song

Hi Fangrui,

> 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.

Solaris/x86 ld doesn't support this, so HAVE_LD_PIE_COPYRELOC needs to
stay.  The Solaris 11.3/x86 assembler doesn't support
R_X86_64_*GOTPCRELX.

	Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-05-12  5:27 ` Rainer Orth
@ 2021-05-12  6:33   ` Fangrui Song
  0 siblings, 0 replies; 20+ messages in thread
From: Fangrui Song @ 2021-05-12  6:33 UTC (permalink / raw)
  To: Rainer Orth
  Cc: Fangrui Song via Gcc-patches, Jan Hubicka, Florian Weimer, H.J. Lu

On 2021-05-12, Rainer Orth wrote:
>Hi Fangrui,

Hi Rainer,

>> 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.
>
>Solaris/x86 ld doesn't support this, so HAVE_LD_PIE_COPYRELOC needs to
>stay.  The Solaris 11.3/x86 assembler doesn't support
>R_X86_64_*GOTPCRELX.

Then I'll suggest that platforms which don't support GOTPCRELX just take
the very little performance hit (global variable access really should
not be in bottleneck of any properly written applications).

Avoiding copy relocations is *much* more important than saving few bytes
in global variable access.

If an app still wants faster variable access, use protected[1]/hidden.

[1]: protected data symbol has poor performance, which is the next thing
which should be fixed.

>	Rainer
>
>-- 
>-----------------------------------------------------------------------------
>Rainer Orth, Center for Biotechnology, Bielefeld University

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-05-12  3:29 [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC Fangrui Song
  2021-05-12  5:27 ` Rainer Orth
@ 2021-05-24 16:43 ` Fāng-ruì Sòng
  2021-06-04 22:04   ` Fāng-ruì Sòng
  1 sibling, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-05-24 16:43 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu

Ping https://gcc.gnu.org/pipermail/gcc-patches/2021-May/570139.html

On Tue, May 11, 2021 at 8:29 PM Fangrui Song <maskray@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
>


-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-05-24 16:43 ` Fāng-ruì Sòng
@ 2021-06-04 22:04   ` Fāng-ruì Sòng
  2021-08-19  6:54     ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-06-04 22:04 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu

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



-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-06-04 22:04   ` Fāng-ruì Sòng
@ 2021-08-19  6:54     ` Fāng-ruì Sòng
  2021-09-04 19:11       ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-08-19  6:54 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu

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



-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-08-19  6:54     ` Fāng-ruì Sòng
@ 2021-09-04 19:11       ` Fāng-ruì Sòng
  2021-09-20 18:19         ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-09-04 19:11 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu

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


-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-04 19:11       ` Fāng-ruì Sòng
@ 2021-09-20 18:19         ` Fāng-ruì Sòng
  2021-09-21 16:16           ` Uros Bizjak
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-09-20 18:19 UTC (permalink / raw)
  To: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu, Richard Biener

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



-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-20 18:19         ` Fāng-ruì Sòng
@ 2021-09-21 16:16           ` Uros Bizjak
  2021-09-22  1:56             ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Uros Bizjak @ 2021-09-21 16:16 UTC (permalink / raw)
  To: Fāng-ruì Sòng
  Cc: GCC Patches, Jan Hubicka, Florian Weimer, H.J. Lu,
	Richard Biener, Jakub Jelinek

On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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

From x86 maintainer's PoV, the implementation is trivially correct,
but I have no idea about functionality. HJ, can you please review the
functionality and post your opinion on the patch to move it forward?

Thanks,
Uros.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-21 16:16           ` Uros Bizjak
@ 2021-09-22  1:56             ` H.J. Lu
  2021-09-22  2:08               ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2021-09-22  1:56 UTC (permalink / raw)
  To: Uros Bizjak
  Cc: Fāng-ruì Sòng, GCC Patches, Jan Hubicka,
	Florian Weimer, Richard Biener, Jakub Jelinek

On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
>
> From x86 maintainer's PoV, the implementation is trivially correct,
> but I have no idea about functionality. HJ, can you please review the
> functionality and post your opinion on the patch to move it forward?
>
> Thanks,
> Uros.

I prefer to leave it alone and apply this:

https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html

instead.  I am working to add a nodirect_extern_access attribute based
on feedback at LPC 2021.

-- 
H.J.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-22  1:56             ` H.J. Lu
@ 2021-09-22  2:08               ` Fāng-ruì Sòng
  2021-09-24 17:29                 ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-09-22  2:08 UTC (permalink / raw)
  To: H.J. Lu
  Cc: Uros Bizjak, GCC Patches, Jan Hubicka, Florian Weimer,
	Richard Biener, Jakub Jelinek

On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> >
> > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > <gcc-patches@gcc.gnu.org> wrote:
> > >
> > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> >
> > From x86 maintainer's PoV, the implementation is trivially correct,
> > but I have no idea about functionality. HJ, can you please review the
> > functionality and post your opinion on the patch to move it forward?
> >
> > Thanks,
> > Uros.
>
> I prefer to leave it alone and apply this:
>
> https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
>
> instead.  I am working to add a nodirect_extern_access attribute based
> on feedback at LPC 2021.

I think -fpie should be fixed as soon as possible.

"Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
IMHO this is not a good choice for -fpie.
As the description of this patch says, one of the design goals of
-fpie is to avoid copy relocations.

> In executable and shared library, bind symbols with the STV_PROTECTED visibility locally

As I have repeated many times (also Clang's behavior), STV_PROTECTED
visibility symbol should be bound locally regardless of
-fno-direct-extern-access.

I think it is fair to say all of Michael Matz, Alan Modra, and I think
adding so many behaviors under -fno-direct-extern-access is
over-engineering (well, because I don't think
-fno-direct-extern-access can be selected as the default behavior any
time soon).

https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-22  2:08               ` Fāng-ruì Sòng
@ 2021-09-24 17:29                 ` Fāng-ruì Sòng
  2021-09-24 17:41                   ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-09-24 17:29 UTC (permalink / raw)
  To: H.J. Lu
  Cc: Uros Bizjak, GCC Patches, Jan Hubicka, Florian Weimer,
	Richard Biener, Jakub Jelinek

 On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
>
> On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > >
> > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > <gcc-patches@gcc.gnu.org> wrote:
> > > >
> > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > >
> > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > but I have no idea about functionality. HJ, can you please review the
> > > functionality and post your opinion on the patch to move it forward?
> > >
> > > Thanks,
> > > Uros.
> >
> > I prefer to leave it alone and apply this:
> >
> > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> >
> > instead.  I am working to add a nodirect_extern_access attribute based
> > on feedback at LPC 2021.
>
> I think -fpie should be fixed as soon as possible.
>
> "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> IMHO this is not a good choice for -fpie.
> As the description of this patch says, one of the design goals of
> -fpie is to avoid copy relocations.
>
> > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
>
> As I have repeated many times (also Clang's behavior), STV_PROTECTED
> visibility symbol should be bound locally regardless of
> -fno-direct-extern-access.
>
> I think it is fair to say all of Michael Matz, Alan Modra, and I think
> adding so many behaviors under -fno-direct-extern-access is
> over-engineering (well, because I don't think
> -fno-direct-extern-access can be selected as the default behavior any
> time soon).
>
> https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary

-fno-direct-extern-access should focus on the semantics of non-pic
code, which is the traditional configuration which may introduce copy
relocations.
An important design goal of -fpie/-fPIE was to avoid copy relocations.
The 2014 x86-64 patch deviated the direction (I am sorry that some
Google folks originated it) and the revert is long due. I am glad that
all other architectures still keep the nice property that -fpie/-fPIE
never introduces copy relocations.

-fdirect-extern-access can do something with -fpie/-fPIE but I doubt
anyone may enable it to get the small size benefit.
The -f(no-)?direct-extern-access patch doesn't need to check
HAVE_LD_PIE_COPYRELOC.
The few users (if ever exist) who use -fpie -fdirect-extern-access
should ensure their GNU ld supports copy relocations by themselves.
GCC configure doesn't need to pay the availability check cost. The
support has been available for many years (~2014/2015).

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-24 17:29                 ` Fāng-ruì Sòng
@ 2021-09-24 17:41                   ` H.J. Lu
  2021-09-24 18:14                     ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2021-09-24 17:41 UTC (permalink / raw)
  To: Fāng-ruì Sòng
  Cc: Uros Bizjak, GCC Patches, Jan Hubicka, Florian Weimer,
	Richard Biener, Jakub Jelinek

On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
>
>  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> >
> > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > >
> > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > >
> > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > >
> > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > but I have no idea about functionality. HJ, can you please review the
> > > > functionality and post your opinion on the patch to move it forward?
> > > >
> > > > Thanks,
> > > > Uros.
> > >
> > > I prefer to leave it alone and apply this:
> > >
> > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > >
> > > instead.  I am working to add a nodirect_extern_access attribute based
> > > on feedback at LPC 2021.
> >
> > I think -fpie should be fixed as soon as possible.
> >
> > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > IMHO this is not a good choice for -fpie.
> > As the description of this patch says, one of the design goals of
> > -fpie is to avoid copy relocations.
> >
> > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> >
> > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > visibility symbol should be bound locally regardless of
> > -fno-direct-extern-access.
> >
> > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > adding so many behaviors under -fno-direct-extern-access is
> > over-engineering (well, because I don't think
> > -fno-direct-extern-access can be selected as the default behavior any
> > time soon).
> >
> > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
>
> -fno-direct-extern-access should focus on the semantics of non-pic
> code, which is the traditional configuration which may introduce copy
> relocations.
> An important design goal of -fpie/-fPIE was to avoid copy relocations.
> The 2014 x86-64 patch deviated the direction (I am sorry that some
> Google folks originated it) and the revert is long due. I am glad that
> all other architectures still keep the nice property that -fpie/-fPIE
> never introduces copy relocations.
>
> -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> anyone may enable it to get the small size benefit.
> The -f(no-)?direct-extern-access patch doesn't need to check
> HAVE_LD_PIE_COPYRELOC.
> The few users (if ever exist) who use -fpie -fdirect-extern-access
> should ensure their GNU ld supports copy relocations by themselves.
> GCC configure doesn't need to pay the availability check cost. The
> support has been available for many years (~2014/2015).

I'd like to get rid of copy relocation for both PIE and non-PIE.  But
we should keep copy relocation as an option for both PIE and non-PIE
if people ask for it.

-- 
H.J.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-24 17:41                   ` H.J. Lu
@ 2021-09-24 18:14                     ` Fāng-ruì Sòng
  2021-09-24 18:29                       ` H.J. Lu
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-09-24 18:14 UTC (permalink / raw)
  To: H.J. Lu
  Cc: Uros Bizjak, GCC Patches, Jan Hubicka, Florian Weimer,
	Richard Biener, Jakub Jelinek

On Fri, Sep 24, 2021 at 10:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> >
> >  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> > >
> > > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > >
> > > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > > >
> > > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > > >
> > > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > > >
> > > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > > but I have no idea about functionality. HJ, can you please review the
> > > > > functionality and post your opinion on the patch to move it forward?
> > > > >
> > > > > Thanks,
> > > > > Uros.
> > > >
> > > > I prefer to leave it alone and apply this:
> > > >
> > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > > >
> > > > instead.  I am working to add a nodirect_extern_access attribute based
> > > > on feedback at LPC 2021.
> > >
> > > I think -fpie should be fixed as soon as possible.
> > >
> > > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > > IMHO this is not a good choice for -fpie.
> > > As the description of this patch says, one of the design goals of
> > > -fpie is to avoid copy relocations.
> > >
> > > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> > >
> > > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > > visibility symbol should be bound locally regardless of
> > > -fno-direct-extern-access.
> > >
> > > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > > adding so many behaviors under -fno-direct-extern-access is
> > > over-engineering (well, because I don't think
> > > -fno-direct-extern-access can be selected as the default behavior any
> > > time soon).
> > >
> > > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
> >
> > -fno-direct-extern-access should focus on the semantics of non-pic
> > code, which is the traditional configuration which may introduce copy
> > relocations.
> > An important design goal of -fpie/-fPIE was to avoid copy relocations.
> > The 2014 x86-64 patch deviated the direction (I am sorry that some
> > Google folks originated it) and the revert is long due. I am glad that
> > all other architectures still keep the nice property that -fpie/-fPIE
> > never introduces copy relocations.
> >
> > -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> > anyone may enable it to get the small size benefit.
> > The -f(no-)?direct-extern-access patch doesn't need to check
> > HAVE_LD_PIE_COPYRELOC.
> > The few users (if ever exist) who use -fpie -fdirect-extern-access
> > should ensure their GNU ld supports copy relocations by themselves.
> > GCC configure doesn't need to pay the availability check cost. The
> > support has been available for many years (~2014/2015).
>
> I'd like to get rid of copy relocation for both PIE and non-PIE.  But
> we should keep copy relocation as an option for both PIE and non-PIE
> if people ask for it.

They still have a copy relocation option for PIE with your
-fdirect-extern-access :)

People's complaints are about the default behavior for PIE: on all
other architectures, the default code generation should avoid copy
relocations.
For example the Qt issue (https://bugreports.qt.io/browse/QTBUG-45755)
was related to GCC 5 x86-64 switching to copy relocations behavior for
PIE.
Qt folks forced PIC to avoid copy relocations.


-f(no-)?direct-extern-access is a great addition. (As I previously
mentioned I have some small reservation whether a GNU property should
be used, but that is minor preference.)
I don't mind -fno-pic defaulting to -fno-direct-extern-access like
mips in the future.
But I do mind whether PIE users need to explicitly specify
-fno-direct-extern-access to avoid copy relocations.
Like most other architecture and Clang x86-64, they should not need to
specify anything.
They shouldn't need a GNU property to prevent that.


I hope I've given sufficient justification why I think this revert is
still useful with your -f(no-)direct-extern-access.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-24 18:14                     ` Fāng-ruì Sòng
@ 2021-09-24 18:29                       ` H.J. Lu
  2021-10-08 17:57                         ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: H.J. Lu @ 2021-09-24 18:29 UTC (permalink / raw)
  To: Fāng-ruì Sòng
  Cc: Uros Bizjak, GCC Patches, Jan Hubicka, Florian Weimer,
	Richard Biener, Jakub Jelinek

On Fri, Sep 24, 2021 at 11:14 AM Fāng-ruì Sòng <maskray@google.com> wrote:
>
> On Fri, Sep 24, 2021 at 10:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > >
> > >  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > >
> > > > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > > >
> > > > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > > > >
> > > > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > > > >
> > > > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > > > >
> > > > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > > > but I have no idea about functionality. HJ, can you please review the
> > > > > > functionality and post your opinion on the patch to move it forward?
> > > > > >
> > > > > > Thanks,
> > > > > > Uros.
> > > > >
> > > > > I prefer to leave it alone and apply this:
> > > > >
> > > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > > > >
> > > > > instead.  I am working to add a nodirect_extern_access attribute based
> > > > > on feedback at LPC 2021.
> > > >
> > > > I think -fpie should be fixed as soon as possible.
> > > >
> > > > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > > > IMHO this is not a good choice for -fpie.
> > > > As the description of this patch says, one of the design goals of
> > > > -fpie is to avoid copy relocations.
> > > >
> > > > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> > > >
> > > > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > > > visibility symbol should be bound locally regardless of
> > > > -fno-direct-extern-access.
> > > >
> > > > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > > > adding so many behaviors under -fno-direct-extern-access is
> > > > over-engineering (well, because I don't think
> > > > -fno-direct-extern-access can be selected as the default behavior any
> > > > time soon).
> > > >
> > > > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
> > >
> > > -fno-direct-extern-access should focus on the semantics of non-pic
> > > code, which is the traditional configuration which may introduce copy
> > > relocations.
> > > An important design goal of -fpie/-fPIE was to avoid copy relocations.
> > > The 2014 x86-64 patch deviated the direction (I am sorry that some
> > > Google folks originated it) and the revert is long due. I am glad that
> > > all other architectures still keep the nice property that -fpie/-fPIE
> > > never introduces copy relocations.
> > >
> > > -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> > > anyone may enable it to get the small size benefit.
> > > The -f(no-)?direct-extern-access patch doesn't need to check
> > > HAVE_LD_PIE_COPYRELOC.
> > > The few users (if ever exist) who use -fpie -fdirect-extern-access
> > > should ensure their GNU ld supports copy relocations by themselves.
> > > GCC configure doesn't need to pay the availability check cost. The
> > > support has been available for many years (~2014/2015).
> >
> > I'd like to get rid of copy relocation for both PIE and non-PIE.  But
> > we should keep copy relocation as an option for both PIE and non-PIE
> > if people ask for it.
>
> They still have a copy relocation option for PIE with your
> -fdirect-extern-access :)

This is the whole point.

> People's complaints are about the default behavior for PIE: on all
> other architectures, the default code generation should avoid copy
> relocations.
> For example the Qt issue (https://bugreports.qt.io/browse/QTBUG-45755)
> was related to GCC 5 x86-64 switching to copy relocations behavior for
> PIE.
> Qt folks forced PIC to avoid copy relocations.
>
>
> -f(no-)?direct-extern-access is a great addition. (As I previously
> mentioned I have some small reservation whether a GNU property should
> be used, but that is minor preference.)
> I don't mind -fno-pic defaulting to -fno-direct-extern-access like
> mips in the future.
> But I do mind whether PIE users need to explicitly specify
> -fno-direct-extern-access to avoid copy relocations.
> Like most other architecture and Clang x86-64, they should not need to
> specify anything.
> They shouldn't need a GNU property to prevent that.
>
>
> I hope I've given sufficient justification why I think this revert is
> still useful with your -f(no-)direct-extern-access.



-- 
H.J.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-09-24 18:29                       ` H.J. Lu
@ 2021-10-08 17:57                         ` Fāng-ruì Sòng
  2021-11-01  2:36                           ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-10-08 17:57 UTC (permalink / raw)
  To: Uros Bizjak, Jan Hubicka, Richard Biener, Jakub Jelinek
  Cc: H.J. Lu, GCC Patches, Florian Weimer

On Fri, Sep 24, 2021 at 11:29 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> On Fri, Sep 24, 2021 at 11:14 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> >
> > On Fri, Sep 24, 2021 at 10:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > >
> > > >  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > > >
> > > > > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > > > >
> > > > > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > > > > >
> > > > > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > > > > >
> > > > > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > > > > >
> > > > > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > > > > but I have no idea about functionality. HJ, can you please review the
> > > > > > > functionality and post your opinion on the patch to move it forward?
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Uros.
> > > > > >
> > > > > > I prefer to leave it alone and apply this:
> > > > > >
> > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > > > > >
> > > > > > instead.  I am working to add a nodirect_extern_access attribute based
> > > > > > on feedback at LPC 2021.
> > > > >
> > > > > I think -fpie should be fixed as soon as possible.
> > > > >
> > > > > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > > > > IMHO this is not a good choice for -fpie.
> > > > > As the description of this patch says, one of the design goals of
> > > > > -fpie is to avoid copy relocations.
> > > > >
> > > > > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> > > > >
> > > > > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > > > > visibility symbol should be bound locally regardless of
> > > > > -fno-direct-extern-access.
> > > > >
> > > > > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > > > > adding so many behaviors under -fno-direct-extern-access is
> > > > > over-engineering (well, because I don't think
> > > > > -fno-direct-extern-access can be selected as the default behavior any
> > > > > time soon).
> > > > >
> > > > > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
> > > >
> > > > -fno-direct-extern-access should focus on the semantics of non-pic
> > > > code, which is the traditional configuration which may introduce copy
> > > > relocations.
> > > > An important design goal of -fpie/-fPIE was to avoid copy relocations.
> > > > The 2014 x86-64 patch deviated the direction (I am sorry that some
> > > > Google folks originated it) and the revert is long due. I am glad that
> > > > all other architectures still keep the nice property that -fpie/-fPIE
> > > > never introduces copy relocations.
> > > >
> > > > -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> > > > anyone may enable it to get the small size benefit.
> > > > The -f(no-)?direct-extern-access patch doesn't need to check
> > > > HAVE_LD_PIE_COPYRELOC.
> > > > The few users (if ever exist) who use -fpie -fdirect-extern-access
> > > > should ensure their GNU ld supports copy relocations by themselves.
> > > > GCC configure doesn't need to pay the availability check cost. The
> > > > support has been available for many years (~2014/2015).
> > >
> > > I'd like to get rid of copy relocation for both PIE and non-PIE.  But
> > > we should keep copy relocation as an option for both PIE and non-PIE
> > > if people ask for it.
> >
> > They still have a copy relocation option for PIE with your
> > -fdirect-extern-access :)
>
> This is the whole point.

Then can a maintainer apply the patch?

The (to-be-reverted) original x86-64 -fpie/-fPIE patch is a dangerous
and micro optimization which has caused continuous pain, also an
outlier from all sane architectures even including x86-32.
By default users should get no copy relocation with -fpie/-fPIE.
When H.J.'s -fdirect-extern-access lands, the users who want to play
danger can still get the micro optimization.

> > People's complaints are about the default behavior for PIE: on all
> > other architectures, the default code generation should avoid copy
> > relocations.
> > For example the Qt issue (https://bugreports.qt.io/browse/QTBUG-45755)
> > was related to GCC 5 x86-64 switching to copy relocations behavior for
> > PIE.
> > Qt folks forced PIC to avoid copy relocations.
> >
> >
> > -f(no-)?direct-extern-access is a great addition. (As I previously
> > mentioned I have some small reservation whether a GNU property should
> > be used, but that is minor preference.)
> > I don't mind -fno-pic defaulting to -fno-direct-extern-access like
> > mips in the future.
> > But I do mind whether PIE users need to explicitly specify
> > -fno-direct-extern-access to avoid copy relocations.
> > Like most other architecture and Clang x86-64, they should not need to
> > specify anything.
> > They shouldn't need a GNU property to prevent that.
> >
> >
> > I hope I've given sufficient justification why I think this revert is
> > still useful with your -f(no-)direct-extern-access.

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-10-08 17:57                         ` Fāng-ruì Sòng
@ 2021-11-01  2:36                           ` Fāng-ruì Sòng
  2022-06-02  7:48                             ` Fāng-ruì Sòng
  0 siblings, 1 reply; 20+ messages in thread
From: Fāng-ruì Sòng @ 2021-11-01  2:36 UTC (permalink / raw)
  To: Uros Bizjak, Jan Hubicka, Richard Biener, Jakub Jelinek
  Cc: H.J. Lu, GCC Patches, Florian Weimer

On Fri, Oct 8, 2021 at 10:57 AM Fāng-ruì Sòng <maskray@google.com> wrote:
>
> On Fri, Sep 24, 2021 at 11:29 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> >
> > On Fri, Sep 24, 2021 at 11:14 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > >
> > > On Fri, Sep 24, 2021 at 10:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > >
> > > > On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > > >
> > > > >  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > > > >
> > > > > > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > > > > >
> > > > > > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > > > > > >
> > > > > > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > > > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > > > > > >
> > > > > > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > > > > > >
> > > > > > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > > > > > but I have no idea about functionality. HJ, can you please review the
> > > > > > > > functionality and post your opinion on the patch to move it forward?
> > > > > > > >
> > > > > > > > Thanks,
> > > > > > > > Uros.
> > > > > > >
> > > > > > > I prefer to leave it alone and apply this:
> > > > > > >
> > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > > > > > >
> > > > > > > instead.  I am working to add a nodirect_extern_access attribute based
> > > > > > > on feedback at LPC 2021.
> > > > > >
> > > > > > I think -fpie should be fixed as soon as possible.
> > > > > >
> > > > > > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > > > > > IMHO this is not a good choice for -fpie.
> > > > > > As the description of this patch says, one of the design goals of
> > > > > > -fpie is to avoid copy relocations.
> > > > > >
> > > > > > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> > > > > >
> > > > > > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > > > > > visibility symbol should be bound locally regardless of
> > > > > > -fno-direct-extern-access.
> > > > > >
> > > > > > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > > > > > adding so many behaviors under -fno-direct-extern-access is
> > > > > > over-engineering (well, because I don't think
> > > > > > -fno-direct-extern-access can be selected as the default behavior any
> > > > > > time soon).
> > > > > >
> > > > > > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
> > > > >
> > > > > -fno-direct-extern-access should focus on the semantics of non-pic
> > > > > code, which is the traditional configuration which may introduce copy
> > > > > relocations.
> > > > > An important design goal of -fpie/-fPIE was to avoid copy relocations.
> > > > > The 2014 x86-64 patch deviated the direction (I am sorry that some
> > > > > Google folks originated it) and the revert is long due. I am glad that
> > > > > all other architectures still keep the nice property that -fpie/-fPIE
> > > > > never introduces copy relocations.
> > > > >
> > > > > -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> > > > > anyone may enable it to get the small size benefit.
> > > > > The -f(no-)?direct-extern-access patch doesn't need to check
> > > > > HAVE_LD_PIE_COPYRELOC.
> > > > > The few users (if ever exist) who use -fpie -fdirect-extern-access
> > > > > should ensure their GNU ld supports copy relocations by themselves.
> > > > > GCC configure doesn't need to pay the availability check cost. The
> > > > > support has been available for many years (~2014/2015).
> > > >
> > > > I'd like to get rid of copy relocation for both PIE and non-PIE.  But
> > > > we should keep copy relocation as an option for both PIE and non-PIE
> > > > if people ask for it.
> > >
> > > They still have a copy relocation option for PIE with your
> > > -fdirect-extern-access :)
> >
> > This is the whole point.
>
> Then can a maintainer apply the patch?
>
> The (to-be-reverted) original x86-64 -fpie/-fPIE patch is a dangerous
> and micro optimization which has caused continuous pain, also an
> outlier from all sane architectures even including x86-32.
> By default users should get no copy relocation with -fpie/-fPIE.
> When H.J.'s -fdirect-extern-access lands, the users who want to play
> danger can still get the micro optimization.
>
> > > People's complaints are about the default behavior for PIE: on all
> > > other architectures, the default code generation should avoid copy
> > > relocations.
> > > For example the Qt issue (https://bugreports.qt.io/browse/QTBUG-45755)
> > > was related to GCC 5 x86-64 switching to copy relocations behavior for
> > > PIE.
> > > Qt folks forced PIC to avoid copy relocations.
> > >
> > >
> > > -f(no-)?direct-extern-access is a great addition. (As I previously
> > > mentioned I have some small reservation whether a GNU property should
> > > be used, but that is minor preference.)
> > > I don't mind -fno-pic defaulting to -fno-direct-extern-access like
> > > mips in the future.
> > > But I do mind whether PIE users need to explicitly specify
> > > -fno-direct-extern-access to avoid copy relocations.
> > > Like most other architecture and Clang x86-64, they should not need to
> > > specify anything.
> > > They shouldn't need a GNU property to prevent that.
> > >
> > >
> > > I hope I've given sufficient justification why I think this revert is
> > > still useful with your -f(no-)direct-extern-access.


Ping.

https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/0PMCJ0hjBAAJ
by Ali Bahrami was a nice reading.

"My free advice (worth what you paid for it) is to roll out the
support, and then wait a bit before turning on the use widely, so that
the support is in place before it is needed, and to not complicate
things with a way to catch time travelers. The window of time where
this can be a problem is finite, and once you're past it, you'll be
glad to have a simpler system."

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2021-11-01  2:36                           ` Fāng-ruì Sòng
@ 2022-06-02  7:48                             ` Fāng-ruì Sòng
  0 siblings, 0 replies; 20+ messages in thread
From: Fāng-ruì Sòng @ 2022-06-02  7:48 UTC (permalink / raw)
  To: Uros Bizjak, Jan Hubicka, Richard Biener, Jakub Jelinek
  Cc: H.J. Lu, GCC Patches, Florian Weimer

On Sun, Oct 31, 2021 at 7:36 PM Fāng-ruì Sòng <maskray@google.com> wrote:
>
> On Fri, Oct 8, 2021 at 10:57 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> >
> > On Fri, Sep 24, 2021 at 11:29 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > >
> > > On Fri, Sep 24, 2021 at 11:14 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > >
> > > > On Fri, Sep 24, 2021 at 10:41 AM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > > >
> > > > > On Fri, Sep 24, 2021 at 10:29 AM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > > > >
> > > > > >  On Tue, Sep 21, 2021 at 7:08 PM Fāng-ruì Sòng <maskray@google.com> wrote:
> > > > > > >
> > > > > > > On Tue, Sep 21, 2021 at 6:57 PM H.J. Lu <hjl.tools@gmail.com> wrote:
> > > > > > > >
> > > > > > > > On Tue, Sep 21, 2021 at 9:16 AM Uros Bizjak <ubizjak@gmail.com> wrote:
> > > > > > > > >
> > > > > > > > > On Mon, Sep 20, 2021 at 8:20 PM Fāng-ruì Sòng via Gcc-patches
> > > > > > > > > <gcc-patches@gcc.gnu.org> wrote:
> > > > > > > > > >
> > > > > > > > > > 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 <maskray@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 <maskray@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 <maskray@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 <maskray@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 <maskray@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
> > > > > > > > >
> > > > > > > > > From x86 maintainer's PoV, the implementation is trivially correct,
> > > > > > > > > but I have no idea about functionality. HJ, can you please review the
> > > > > > > > > functionality and post your opinion on the patch to move it forward?
> > > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > > Uros.
> > > > > > > >
> > > > > > > > I prefer to leave it alone and apply this:
> > > > > > > >
> > > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2021-August/576736.html
> > > > > > > >
> > > > > > > > instead.  I am working to add a nodirect_extern_access attribute based
> > > > > > > > on feedback at LPC 2021.
> > > > > > >
> > > > > > > I think -fpie should be fixed as soon as possible.
> > > > > > >
> > > > > > > "Add -f[no-]direct-extern-access" says "-fdirect-extern-access is the default."
> > > > > > > IMHO this is not a good choice for -fpie.
> > > > > > > As the description of this patch says, one of the design goals of
> > > > > > > -fpie is to avoid copy relocations.
> > > > > > >
> > > > > > > > In executable and shared library, bind symbols with the STV_PROTECTED visibility locally
> > > > > > >
> > > > > > > As I have repeated many times (also Clang's behavior), STV_PROTECTED
> > > > > > > visibility symbol should be bound locally regardless of
> > > > > > > -fno-direct-extern-access.
> > > > > > >
> > > > > > > I think it is fair to say all of Michael Matz, Alan Modra, and I think
> > > > > > > adding so many behaviors under -fno-direct-extern-access is
> > > > > > > over-engineering (well, because I don't think
> > > > > > > -fno-direct-extern-access can be selected as the default behavior any
> > > > > > > time soon).
> > > > > > >
> > > > > > > https://maskray.me/blog/2021-01-09-copy-relocations-canonical-plt-entries-and-protected#summary
> > > > > >
> > > > > > -fno-direct-extern-access should focus on the semantics of non-pic
> > > > > > code, which is the traditional configuration which may introduce copy
> > > > > > relocations.
> > > > > > An important design goal of -fpie/-fPIE was to avoid copy relocations.
> > > > > > The 2014 x86-64 patch deviated the direction (I am sorry that some
> > > > > > Google folks originated it) and the revert is long due. I am glad that
> > > > > > all other architectures still keep the nice property that -fpie/-fPIE
> > > > > > never introduces copy relocations.
> > > > > >
> > > > > > -fdirect-extern-access can do something with -fpie/-fPIE but I doubt
> > > > > > anyone may enable it to get the small size benefit.
> > > > > > The -f(no-)?direct-extern-access patch doesn't need to check
> > > > > > HAVE_LD_PIE_COPYRELOC.
> > > > > > The few users (if ever exist) who use -fpie -fdirect-extern-access
> > > > > > should ensure their GNU ld supports copy relocations by themselves.
> > > > > > GCC configure doesn't need to pay the availability check cost. The
> > > > > > support has been available for many years (~2014/2015).
> > > > >
> > > > > I'd like to get rid of copy relocation for both PIE and non-PIE.  But
> > > > > we should keep copy relocation as an option for both PIE and non-PIE
> > > > > if people ask for it.
> > > >
> > > > They still have a copy relocation option for PIE with your
> > > > -fdirect-extern-access :)
> > >
> > > This is the whole point.
> >
> > Then can a maintainer apply the patch?
> >
> > The (to-be-reverted) original x86-64 -fpie/-fPIE patch is a dangerous
> > and micro optimization which has caused continuous pain, also an
> > outlier from all sane architectures even including x86-32.
> > By default users should get no copy relocation with -fpie/-fPIE.
> > When H.J.'s -fdirect-extern-access lands, the users who want to play
> > danger can still get the micro optimization.
> >
> > > > People's complaints are about the default behavior for PIE: on all
> > > > other architectures, the default code generation should avoid copy
> > > > relocations.
> > > > For example the Qt issue (https://bugreports.qt.io/browse/QTBUG-45755)
> > > > was related to GCC 5 x86-64 switching to copy relocations behavior for
> > > > PIE.
> > > > Qt folks forced PIC to avoid copy relocations.
> > > >
> > > >
> > > > -f(no-)?direct-extern-access is a great addition. (As I previously
> > > > mentioned I have some small reservation whether a GNU property should
> > > > be used, but that is minor preference.)
> > > > I don't mind -fno-pic defaulting to -fno-direct-extern-access like
> > > > mips in the future.
> > > > But I do mind whether PIE users need to explicitly specify
> > > > -fno-direct-extern-access to avoid copy relocations.
> > > > Like most other architecture and Clang x86-64, they should not need to
> > > > specify anything.
> > > > They shouldn't need a GNU property to prevent that.
> > > >
> > > >
> > > > I hope I've given sufficient justification why I think this revert is
> > > > still useful with your -f(no-)direct-extern-access.
>
>
> Ping.
>
> https://groups.google.com/g/generic-abi/c/bX460iggiKg/m/0PMCJ0hjBAAJ
> by Ali Bahrami was a nice reading.
>
> "My free advice (worth what you paid for it) is to roll out the
> support, and then wait a bit before turning on the use widely, so that
> the support is in place before it is needed, and to not complicate
> things with a way to catch time travelers. The window of time where
> this can be a problem is finite, and once you're past it, you'll be
> glad to have a simpler system."

Ping https://sourceware.org/pipermail/gcc-patches/2021-May/570139.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
  2022-06-15  8:34 Fangrui Song
@ 2022-06-21  3:51 ` Fangrui Song
  0 siblings, 0 replies; 20+ messages in thread
From: Fangrui Song @ 2022-06-21  3:51 UTC (permalink / raw)
  To: gcc-patches, Jan Hubicka, H . J . Lu, Uros Bizjak

On Wed, Jun 15, 2022 at 2:34 AM Fangrui Song <maskray@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
>


-- 
宋方睿

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC
@ 2022-06-15  8:34 Fangrui Song
  2022-06-21  3:51 ` Fangrui Song
  0 siblings, 1 reply; 20+ messages in thread
From: Fangrui Song @ 2022-06-15  8:34 UTC (permalink / raw)
  To: gcc-patches, Jan Hubicka, H . J . Lu

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


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2022-06-21  3:51 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-12  3:29 [PATCH] x86-64: Remove HAVE_LD_PIE_COPYRELOC Fangrui Song
2021-05-12  5:27 ` Rainer Orth
2021-05-12  6:33   ` Fangrui Song
2021-05-24 16:43 ` Fāng-ruì Sòng
2021-06-04 22:04   ` Fāng-ruì Sòng
2021-08-19  6:54     ` Fāng-ruì Sòng
2021-09-04 19:11       ` Fāng-ruì Sòng
2021-09-20 18:19         ` Fāng-ruì Sòng
2021-09-21 16:16           ` Uros Bizjak
2021-09-22  1:56             ` H.J. Lu
2021-09-22  2:08               ` Fāng-ruì Sòng
2021-09-24 17:29                 ` Fāng-ruì Sòng
2021-09-24 17:41                   ` H.J. Lu
2021-09-24 18:14                     ` Fāng-ruì Sòng
2021-09-24 18:29                       ` H.J. Lu
2021-10-08 17:57                         ` Fāng-ruì Sòng
2021-11-01  2:36                           ` Fāng-ruì Sòng
2022-06-02  7:48                             ` Fāng-ruì Sòng
2022-06-15  8:34 Fangrui Song
2022-06-21  3:51 ` Fangrui Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).