This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] PR target/65248: [5 Regression] Copy relocation in PIE against protected symbol
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: "H.J. Lu" <hjl dot tools at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Uros Bizjak <ubizjak at gmail dot com>
- Date: Mon, 2 Mar 2015 09:40:01 +0100
- Subject: Re: [PATCH] PR target/65248: [5 Regression] Copy relocation in PIE against protected symbol
- Authentication-results: sourceware.org; auth=none
- References: <20150228164223 dot GA22402 at gmail dot com>
On Sat, Feb 28, 2015 at 5:42 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> Ue copy relocation in PIE improves performance. But copy relocation
> can't be used to access protected symbols defined in shared libaries
> and linker in binutils 2.26 enforces doesn't allow it. GCC doesn't
> know if an external definition is protected or not. This option adds
> -mcopyreloc-in-pie to give user an option to turn it off to avoid problem
> at link-time. OK for trunk?
I wonder if the linker can fix this up? That is, turn the relocation into
a valid one?
Richard.
> Thanks.
>
>
> H.J.
> ---
> gcc/
>
> PR target/65248
> * config/i386/i386.c (ix86_option_override_internal): Set
> flag_copyreloc_in_pie to HAVE_LD_PIE_COPYRELOC if not set.
> (legitimate_pic_address_disp_p): Replace HAVE_LD_PIE_COPYRELOC
> with flag_copyreloc_in_pie.
> * config/i386/i386.opt (mcopyreloc-in-pie): New.
> * doc/invoke.texi: Document -mcopyreloc-in-pie.
>
> gcc/testsuite/
>
> PR target/65248
> * gcc.target/i386/pr65248-1.c: New.
> * gcc.target/i386/pr65248-2.c: Likewise.
> * gcc.target/i386/pr65248-3.c: Likewise.
> * gcc.target/i386/pr65248-4.c: Likewise.
> ---
> gcc/config/i386/i386.c | 6 +++++-
> gcc/config/i386/i386.opt | 4 ++++
> gcc/doc/invoke.texi | 10 +++++++++-
> gcc/testsuite/gcc.target/i386/pr65248-1.c | 13 +++++++++++++
> gcc/testsuite/gcc.target/i386/pr65248-2.c | 13 +++++++++++++
> gcc/testsuite/gcc.target/i386/pr65248-3.c | 16 ++++++++++++++++
> gcc/testsuite/gcc.target/i386/pr65248-4.c | 16 ++++++++++++++++
> 7 files changed, 76 insertions(+), 2 deletions(-)
> create mode 100644 gcc/testsuite/gcc.target/i386/pr65248-1.c
> create mode 100644 gcc/testsuite/gcc.target/i386/pr65248-2.c
> create mode 100644 gcc/testsuite/gcc.target/i386/pr65248-3.c
> create mode 100644 gcc/testsuite/gcc.target/i386/pr65248-4.c
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index bec1324..6768ee8 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -4248,6 +4248,10 @@ ix86_option_override_internal (bool main_args_p,
> #endif
> }
>
> + /* Set the default value for -mcopyreloc-in-pie. */
> + if (opts->x_flag_copyreloc_in_pie == -1)
> + opts->x_flag_copyreloc_in_pie = HAVE_LD_PIE_COPYRELOC;
> +
> if (!(opts_set->x_target_flags & MASK_VZEROUPPER))
> opts->x_target_flags |= MASK_VZEROUPPER;
> if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL]
> @@ -13230,7 +13234,7 @@ legitimate_pic_address_disp_p (rtx disp)
> }
> else if (!SYMBOL_REF_FAR_ADDR_P (op0)
> && (SYMBOL_REF_LOCAL_P (op0)
> - || (HAVE_LD_PIE_COPYRELOC
> + || (flag_copyreloc_in_pie
> && flag_pie
> && !SYMBOL_REF_WEAK (op0)
> && !SYMBOL_REF_FUNCTION_P (op0)))
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
> index 301430c..55c712c 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -826,6 +826,10 @@ mfentry
> Target Report Var(flag_fentry) Init(-1)
> Emit profiling counter call at function entry before prologue.
>
> +mcopyreloc-in-pie
> +Target Report Var(flag_copyreloc_in_pie) Init(-1)
> +Use copy relocations in Position Independent Executable (PIE)
> +
> mrecord-mcount
> Target Report Var(flag_record_mcount) Init(0)
> Generate __mcount_loc section with all mcount or __fentry__ calls.
> diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
> index a87376e..7fd4e77 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1078,7 +1078,8 @@ See RS/6000 and PowerPC Options.
> -m32 -m64 -mx32 -m16 -mlarge-data-threshold=@var{num} @gol
> -msse2avx -mfentry -mrecord-mcount -mnop-mcount -m8bit-idiv @gol
> -mavx256-split-unaligned-load -mavx256-split-unaligned-store @gol
> --malign-data=@var{type} -mstack-protector-guard=@var{guard}}
> +-malign-data=@var{type} -mstack-protector-guard=@var{guard}} @gol
> +-mcopyreloc-in-pie
>
> @emph{x86 Windows Options}
> @gccoptlist{-mconsole -mcygwin -mno-cygwin -mdll @gol
> @@ -22704,6 +22705,13 @@ For systems that use the GNU C Library, the default is on.
> Specify that the assembler should encode SSE instructions with VEX
> prefix. The option @option{-mavx} turns this on by default.
>
> +@item -mcopyreloc-in-pie
> +@itemx -mno-copyreloc-in-pie
> +@opindex mcopyreloc-in-pie
> +Use copy relocations in Position Independent Executable (PIE). It
> +requires linker support. This option is turned on by default if linker
> +used to build GCC supports it.
> +
> @item -mfentry
> @itemx -mno-fentry
> @opindex mfentry
> diff --git a/gcc/testsuite/gcc.target/i386/pr65248-1.c b/gcc/testsuite/gcc.target/i386/pr65248-1.c
> new file mode 100644
> index 0000000..91aa6be
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr65248-1.c
> @@ -0,0 +1,13 @@
> +/* Check that GOTPCREL isn't used to access glob_a. */
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpie -mcopyreloc-in-pie" } */
> +
> +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/pr65248-2.c b/gcc/testsuite/gcc.target/i386/pr65248-2.c
> new file mode 100644
> index 0000000..dc8445c
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr65248-2.c
> @@ -0,0 +1,13 @@
> +/* Check that GOTPCREL isn't used to access glob_a. */
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpie -mno-copyreloc-in-pie" } */
> +
> +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/pr65248-3.c b/gcc/testsuite/gcc.target/i386/pr65248-3.c
> new file mode 100644
> index 0000000..9398fd2
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr65248-3.c
> @@ -0,0 +1,16 @@
> +/* Check that GOTPCREL is used to access glob_a. */
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpie -mno-copyreloc-in-pie" } */
> +
> +extern int glob_a;
> +
> +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/pr65248-4.c b/gcc/testsuite/gcc.target/i386/pr65248-4.c
> new file mode 100644
> index 0000000..6d7cc86
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr65248-4.c
> @@ -0,0 +1,16 @@
> +/* Check that GOTPCREL is used to access glob_a. */
> +/* { dg-do compile { target *-*-linux* } } */
> +/* { dg-options "-O2 -fpie -mno-copyreloc-in-pie" } */
> +
> +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 } } } } */
> --
> 2.1.0
>
> Reply-To:
>