| From d7dc2861840e88a4592817a398a054a886c3f3ee Mon Sep 17 00:00:00 2001 |
| From: Khem Raj <raj.khem@gmail.com> |
| Date: Tue, 27 Jun 2017 18:10:54 -0700 |
| Subject: [PATCH] Add ssp_nonshared to link commandline for musl targets |
| |
| when -fstack-protector options are enabled we need to |
| link with ssp_shared on musl since it does not provide |
| the __stack_chk_fail_local() so essentially it provides |
| libssp but not libssp_nonshared something like |
| TARGET_LIBC_PROVIDES_SSP_BUT_NOT_SSP_NONSHARED |
| where-as for glibc the needed symbols |
| are already present in libc_nonshared library therefore |
| we do not need any library helper on glibc based systems |
| but musl needs the libssp_noshared from gcc |
| |
| Upstream-Status: Pending |
| |
| Signed-off-by: Khem Raj <raj.khem@gmail.com> |
| --- |
| gcc/config/linux.h | 7 +++++++ |
| gcc/config/rs6000/linux.h | 10 ++++++++++ |
| gcc/config/rs6000/linux64.h | 10 ++++++++++ |
| 3 files changed, 27 insertions(+) |
| |
| diff --git a/gcc/config/linux.h b/gcc/config/linux.h |
| index 58143dff731..d2409ccac26 100644 |
| --- a/gcc/config/linux.h |
| +++ b/gcc/config/linux.h |
| @@ -208,6 +208,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see |
| { GCC_INCLUDE_DIRVAR, "GCC", 0, 1, 0, 0 }, \ |
| { 0, 0, 0, 0, 0, 0 } \ |
| } |
| +#ifdef TARGET_LIBC_PROVIDES_SSP |
| +#undef LINK_SSP_SPEC |
| +#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ |
| + "|fstack-protector-strong|fstack-protector-explicit" \ |
| + ":-lssp_nonshared}" |
| +#endif |
| + |
| #endif |
| |
| #if (DEFAULT_LIBC == LIBC_UCLIBC) && defined (SINGLE_LIBC) /* uClinux */ |
| diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h |
| index 8c9039ac1e5..259cd485973 100644 |
| --- a/gcc/config/rs6000/linux.h |
| +++ b/gcc/config/rs6000/linux.h |
| @@ -99,6 +99,16 @@ |
| " -m elf32ppclinux") |
| #endif |
| |
| +/* link libssp_nonshared.a with musl */ |
| +#if DEFAULT_LIBC == LIBC_MUSL |
| +#ifdef TARGET_LIBC_PROVIDES_SSP |
| +#undef LINK_SSP_SPEC |
| +#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ |
| + "|fstack-protector-strong|fstack-protector-explicit" \ |
| + ":-lssp_nonshared}" |
| +#endif |
| +#endif |
| + |
| #undef LINK_OS_LINUX_SPEC |
| #define LINK_OS_LINUX_SPEC LINK_OS_LINUX_EMUL " %{!shared: %{!static: \ |
| %{!static-pie: \ |
| diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h |
| index 364c1a5b155..e33d9ae98e0 100644 |
| --- a/gcc/config/rs6000/linux64.h |
| +++ b/gcc/config/rs6000/linux64.h |
| @@ -372,6 +372,16 @@ extern int dot_symbols; |
| " -m elf64ppc") |
| #endif |
| |
| +/* link libssp_nonshared.a with musl */ |
| +#if DEFAULT_LIBC == LIBC_MUSL |
| +#ifdef TARGET_LIBC_PROVIDES_SSP |
| +#undef LINK_SSP_SPEC |
| +#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all" \ |
| + "|fstack-protector-strong|fstack-protector-explicit" \ |
| + ":-lssp_nonshared}" |
| +#endif |
| +#endif |
| + |
| #define LINK_OS_LINUX_SPEC32 LINK_OS_LINUX_EMUL32 " %{!shared: %{!static: \ |
| %{!static-pie: \ |
| %{rdynamic:-export-dynamic} \ |