This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, rs6000] Pass --secure-plt to the linker
- From: Alan Modra <amodra at gmail dot com>
- To: Szabolcs Nagy <szabolcs dot nagy at arm dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, David Edelsohn <dje dot gcc at gmail dot com>, gregor dot richards at uwaterloo dot ca, Rich Felker <dalias at libc dot org>
- Date: Tue, 20 Oct 2015 15:46:33 +1030
- Subject: Re: [PATCH, rs6000] Pass --secure-plt to the linker
- Authentication-results: sourceware.org; auth=none
- References: <561FE77A dot 5000900 at arm dot com> <20151019111202 dot GJ13961 at bubble dot grove dot modra dot org> <5624EA40 dot 70905 at arm dot com> <56254028 dot 9040508 at arm dot com>
On Mon, Oct 19, 2015 at 08:10:32PM +0100, Szabolcs Nagy wrote:
> On 19/10/15 14:04, Szabolcs Nagy wrote:
> >On 19/10/15 12:12, Alan Modra wrote:
> >>On Thu, Oct 15, 2015 at 06:50:50PM +0100, Szabolcs Nagy wrote:
> >>>A powerpc toolchain built with (or without) --enable-secureplt
> >>>currently creates a binary that uses bss plt if
> >>>
> >>>(1) any of the linked PIC objects have bss plt relocs
> >>>(2) or all the linked objects are non-PIC or have no relocs,
> >>>
> >>>because this is the binutils linker behaviour.
> >>>
> >>>This patch passes --secure-plt to the linker which makes the linker
> >>>warn in case (1) and produce a binary with secure plt in case (2).
> >>
> >>The idea is OK I think, but
> >>
> >>>@@ -574,6 +577,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
> >>> %{R*} \
> >>> %(link_shlib) \
> >>> %{!T*: %(link_start) } \
> >>>+%{!static: %(link_secure_plt_default)} \
> >>> %(link_os)"
> >>
> >>this change needs to be conditional on !mbss-plt too.
> >>
> >
> >OK, will change that.
> >
> >if -msecure-plt and -mbss-plt are supposed to affect
> >linking too (not just code gen) then shall i add
> >%{msecure-plt: --secure-plt} too?
> >
>
> I added !mbss-plt only for now as a mix of -msecure-plt
> and -mbss-plt options do not cancel each other in gcc,
They do for code-gen since they share the same variable (see
sysv4.opt), but I guess you meant as far as spec parsing goes. In
hindsight, it might have been better if I'd spelled -mbss-plt as
-mno-secure-plt.
> the patch only changes behaviour for a secureplt toolchain.
>
> OK to commit?
Apologies for not thinking of this before when I first reviewed the
patch, but have you bootstrapped this patch on powerpc64-linux? I'm
guessing not, because it occurs to me that --secure-plt is not a
powerpc64-linux-ld option. So if you try to build a biarch compiler
with --enable-secure-plt then ld will complain when attempting to link
64-bit binaries.
You'll want this on top of your patch:
diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h
index 9599735..01fb880 100644
--- a/gcc/config/rs6000/linux64.h
+++ b/gcc/config/rs6000/linux64.h
@@ -174,20 +174,24 @@ extern int dot_symbols;
#undef ASM_DEFAULT_SPEC
#undef ASM_SPEC
#undef LINK_OS_LINUX_SPEC
+#undef LINK_SECURE_PLT_SPEC
#ifndef RS6000_BI_ARCH
#define ASM_DEFAULT_SPEC "-mppc64"
#define ASM_SPEC "%(asm_spec64) %(asm_spec_common)"
#define LINK_OS_LINUX_SPEC "%(link_os_linux_spec64)"
+#define LINK_SECURE_PLT_SPEC ""
#else
#if DEFAULT_ARCH64_P
#define ASM_DEFAULT_SPEC "-mppc%{!m32:64}"
#define ASM_SPEC "%{m32:%(asm_spec32)}%{!m32:%(asm_spec64)} %(asm_spec_common)"
#define LINK_OS_LINUX_SPEC "%{m32:%(link_os_linux_spec32)}%{!m32:%(link_os_linux_spec64)}"
+#define LINK_SECURE_PLT_SPEC "%{m32: " LINK_SECURE_PLT_DEFAULT_SPEC "}"
#else
#define ASM_DEFAULT_SPEC "-mppc%{m64:64}"
#define ASM_SPEC "%{!m64:%(asm_spec32)}%{m64:%(asm_spec64)} %(asm_spec_common)"
#define LINK_OS_LINUX_SPEC "%{!m64:%(link_os_linux_spec32)}%{m64:%(link_os_linux_spec64)}"
+#define LINK_SECURE_PLT_SPEC "%{!m64: " LINK_SECURE_PLT_DEFAULT_SPEC "}"
#endif
#endif
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index 93499e8..1bb400f 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -570,6 +570,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
: %(link_start_default) }"
#define LINK_START_DEFAULT_SPEC ""
+#define LINK_SECURE_PLT_SPEC LINK_SECURE_PLT_DEFAULT_SPEC
#undef LINK_SPEC
#define LINK_SPEC "\
@@ -577,7 +578,7 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
%{R*} \
%(link_shlib) \
%{!T*: %(link_start) } \
-%{!static: %{!mbss-plt: %(link_secure_plt_default)}} \
+%{!static: %{!mbss-plt: %(link_secure_plt)}} \
%(link_os)"
/* Shared libraries are not default. */
@@ -893,7 +894,7 @@ ncrtn.o%s"
{ "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \
{ "link_os_default", LINK_OS_DEFAULT_SPEC }, \
{ "cc1_secure_plt_default", CC1_SECURE_PLT_DEFAULT_SPEC }, \
- { "link_secure_plt_default", LINK_SECURE_PLT_DEFAULT_SPEC }, \
+ { "link_secure_plt", LINK_SECURE_PLT_SPEC }, \
{ "cpp_os_ads", CPP_OS_ADS_SPEC }, \
{ "cpp_os_yellowknife", CPP_OS_YELLOWKNIFE_SPEC }, \
{ "cpp_os_mvme", CPP_OS_MVME_SPEC }, \
--
Alan Modra
Australia Development Lab, IBM