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