|
|
|
gcc/Changelog:
|
|
|
|
2015-04-24 Gregor Richards <gregor.richards@uwaterloo.ca>
|
|
Szabolcs Nagy <szabolcs.nagy@arm.com>
|
|
|
|
* config.gcc (secure_plt): Add *-linux*-musl*.
|
|
* config/rs6000/linux64.h (MUSL_DYNAMIC_LINKER32): Define.
|
|
(MUSL_DYNAMIC_LINKER64): Define.
|
|
(GNU_USER_DYNAMIC_LINKER32): Update.
|
|
(GNU_USER_DYNAMIC_LINKER64): Update.
|
|
(CHOOSE_DYNAMIC_LINKER): Update.
|
|
|
|
* config/rs6000/secureplt.h (LINK_SECURE_PLT_DEFAULT_SPEC): Define.
|
|
* config/rs6000/sysv4.h (GNU_USER_DYNAMIC_LINKER): Update.
|
|
(MUSL_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER_E,)
|
|
(INCLUDE_DEFAULTS_MUSL_GPP, INCLUDE_DEFAULTS_MUSL_LOCAL,)
|
|
(INCLUDE_DEFAULTS_MUSL_PREFIX, INCLUDE_DEFAULTS_MUSL_CROSS,)
|
|
(INCLUDE_DEFAULTS_MUSL_TOOL, INCLUDE_DEFAULTS_MUSL_NATIVE): Define.
|
|
(LINK_SECURE_PLT_DEFAULT_SPEC): Define.
|
|
(CHOOSE_DYNAMIC_LINKER, LINK_TARGET_SPEC, LINK_OS_LINUX_SPEC): Update.
|
|
|
|
* config/rs6000/sysv4le.h (MUSL_DYNAMIC_LINKER_E): Define.
|
|
|
|
--- a/gcc/config/rs6000/linux64.h
|
|
+++ b/gcc/config/rs6000/linux64.h
|
|
@@ -365,17 +365,21 @@ extern int dot_symbols;
|
|
#endif
|
|
#define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0"
|
|
#define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0"
|
|
+#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E ".so.1"
|
|
+#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-powerpc64" MUSL_DYNAMIC_LINKER_E ".so.1"
|
|
#if DEFAULT_LIBC == LIBC_UCLIBC
|
|
-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{mmusl:" M ";:" U "}}"
|
|
#elif DEFAULT_LIBC == LIBC_GLIBC
|
|
-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{muclibc:" U ";:%{mmusl:" M ";:" G "}}"
|
|
+#elif DEFAULT_LIBC == LIBC_MUSL
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{muclibc:" U ";:" M "}}"
|
|
#else
|
|
#error "Unsupported DEFAULT_LIBC"
|
|
#endif
|
|
#define GNU_USER_DYNAMIC_LINKER32 \
|
|
- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32)
|
|
+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32)
|
|
#define GNU_USER_DYNAMIC_LINKER64 \
|
|
- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64)
|
|
+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64)
|
|
|
|
#undef DEFAULT_ASM_ENDIAN
|
|
#if (TARGET_DEFAULT & MASK_LITTLE_ENDIAN)
|
|
--- a/gcc/config/rs6000/secureplt.h
|
|
+++ b/gcc/config/rs6000/secureplt.h
|
|
@@ -18,3 +18,4 @@ along with GCC; see the file COPYING3.
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#define CC1_SECURE_PLT_DEFAULT_SPEC "-msecure-plt"
|
|
+#define LINK_SECURE_PLT_DEFAULT_SPEC "--secure-plt"
|
|
--- a/gcc/config/rs6000/sysv4.h
|
|
+++ b/gcc/config/rs6000/sysv4.h
|
|
@@ -537,6 +537,9 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
|
#ifndef CC1_SECURE_PLT_DEFAULT_SPEC
|
|
#define CC1_SECURE_PLT_DEFAULT_SPEC ""
|
|
#endif
|
|
+#ifndef LINK_SECURE_PLT_DEFAULT_SPEC
|
|
+#define LINK_SECURE_PLT_DEFAULT_SPEC ""
|
|
+#endif
|
|
|
|
/* Pass -G xxx to the compiler. */
|
|
#undef CC1_SPEC
|
|
@@ -574,7 +577,8 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
|
%{R*} \
|
|
%(link_shlib) \
|
|
%{!T*: %(link_start) } \
|
|
-%(link_os)"
|
|
+%(link_os)" \
|
|
+"%{!mbss-plt: %{!msecure-plt: %(link_secure_plt_default)}}"
|
|
|
|
/* Shared libraries are not default. */
|
|
#define LINK_SHLIB_SPEC "\
|
|
@@ -757,17 +761,22 @@ ENDIAN_SELECT(" -mbig", " -mlittle", DEF
|
|
|
|
#define LINK_START_LINUX_SPEC ""
|
|
|
|
+#define MUSL_DYNAMIC_LINKER_E ENDIAN_SELECT("","le","")
|
|
+
|
|
#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1"
|
|
#define UCLIBC_DYNAMIC_LINKER "/lib/ld-uClibc.so.0"
|
|
+#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E ".so.1"
|
|
#if DEFAULT_LIBC == LIBC_UCLIBC
|
|
-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{mglibc:" G ";:" U "}"
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{mmusl:" M ";:" U "}}"
|
|
+#elif DEFAULT_LIBC == LIBC_MUSL
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{mglibc:" G ";:%{muclibc:" U ";:" M "}}"
|
|
#elif !defined (DEFAULT_LIBC) || DEFAULT_LIBC == LIBC_GLIBC
|
|
-#define CHOOSE_DYNAMIC_LINKER(G, U) "%{muclibc:" U ";:" G "}"
|
|
+#define CHOOSE_DYNAMIC_LINKER(G, U, M) "%{muclibc:" U ";:%{mmusl:" M ";:" G "}}"
|
|
#else
|
|
#error "Unsupported DEFAULT_LIBC"
|
|
#endif
|
|
#define GNU_USER_DYNAMIC_LINKER \
|
|
- CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER)
|
|
+ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER)
|
|
|
|
#define LINK_OS_LINUX_SPEC "-m elf32ppclinux %{!shared: %{!static: \
|
|
%{rdynamic:-export-dynamic} \
|
|
@@ -889,6 +898,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 }, \
|
|
{ "cpp_os_ads", CPP_OS_ADS_SPEC }, \
|
|
{ "cpp_os_yellowknife", CPP_OS_YELLOWKNIFE_SPEC }, \
|
|
{ "cpp_os_mvme", CPP_OS_MVME_SPEC }, \
|
|
@@ -943,3 +953,72 @@ ncrtn.o%s"
|
|
/* This target uses the sysv4.opt file. */
|
|
#define TARGET_USES_SYSV4_OPT 1
|
|
|
|
+/* Include order changes for musl, same as in generic linux.h. */
|
|
+#if DEFAULT_LIBC == LIBC_MUSL
|
|
+#define INCLUDE_DEFAULTS_MUSL_GPP \
|
|
+ { GPLUSPLUS_INCLUDE_DIR, "G++", 1, 1, \
|
|
+ GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 }, \
|
|
+ { GPLUSPLUS_TOOL_INCLUDE_DIR, "G++", 1, 1, \
|
|
+ GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 1 }, \
|
|
+ { GPLUSPLUS_BACKWARD_INCLUDE_DIR, "G++", 1, 1, \
|
|
+ GPLUSPLUS_INCLUDE_DIR_ADD_SYSROOT, 0 },
|
|
+
|
|
+#ifdef LOCAL_INCLUDE_DIR
|
|
+#define INCLUDE_DEFAULTS_MUSL_LOCAL \
|
|
+ { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 2 }, \
|
|
+ { LOCAL_INCLUDE_DIR, 0, 0, 1, 1, 0 },
|
|
+#else
|
|
+#define INCLUDE_DEFAULTS_MUSL_LOCAL
|
|
+#endif
|
|
+
|
|
+#ifdef PREFIX_INCLUDE_DIR
|
|
+#define INCLUDE_DEFAULTS_MUSL_PREFIX \
|
|
+ { PREFIX_INCLUDE_DIR, 0, 0, 1, 0, 0},
|
|
+#else
|
|
+#define INCLUDE_DEFAULTS_MUSL_PREFIX
|
|
+#endif
|
|
+
|
|
+#ifdef CROSS_INCLUDE_DIR
|
|
+#define INCLUDE_DEFAULTS_MUSL_CROSS \
|
|
+ { CROSS_INCLUDE_DIR, "GCC", 0, 0, 0, 0},
|
|
+#else
|
|
+#define INCLUDE_DEFAULTS_MUSL_CROSS
|
|
+#endif
|
|
+
|
|
+#ifdef TOOL_INCLUDE_DIR
|
|
+#define INCLUDE_DEFAULTS_MUSL_TOOL \
|
|
+ { TOOL_INCLUDE_DIR, "BINUTILS", 0, 1, 0, 0},
|
|
+#else
|
|
+#define INCLUDE_DEFAULTS_MUSL_TOOL
|
|
+#endif
|
|
+
|
|
+#ifdef NATIVE_SYSTEM_HEADER_DIR
|
|
+#define INCLUDE_DEFAULTS_MUSL_NATIVE \
|
|
+ { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 2 }, \
|
|
+ { NATIVE_SYSTEM_HEADER_DIR, 0, 0, 0, 1, 0 },
|
|
+#else
|
|
+#define INCLUDE_DEFAULTS_MUSL_NATIVE
|
|
+#endif
|
|
+
|
|
+#if defined (CROSS_DIRECTORY_STRUCTURE) && !defined (TARGET_SYSTEM_ROOT)
|
|
+# undef INCLUDE_DEFAULTS_MUSL_LOCAL
|
|
+# define INCLUDE_DEFAULTS_MUSL_LOCAL
|
|
+# undef INCLUDE_DEFAULTS_MUSL_NATIVE
|
|
+# define INCLUDE_DEFAULTS_MUSL_NATIVE
|
|
+#else
|
|
+# undef INCLUDE_DEFAULTS_MUSL_CROSS
|
|
+# define INCLUDE_DEFAULTS_MUSL_CROSS
|
|
+#endif
|
|
+
|
|
+#undef INCLUDE_DEFAULTS
|
|
+#define INCLUDE_DEFAULTS \
|
|
+ { \
|
|
+ INCLUDE_DEFAULTS_MUSL_GPP \
|
|
+ INCLUDE_DEFAULTS_MUSL_PREFIX \
|
|
+ INCLUDE_DEFAULTS_MUSL_CROSS \
|
|
+ INCLUDE_DEFAULTS_MUSL_TOOL \
|
|
+ INCLUDE_DEFAULTS_MUSL_NATIVE \
|
|
+ { GCC_INCLUDE_DIR, "GCC", 0, 1, 0, 0 }, \
|
|
+ { 0, 0, 0, 0, 0, 0 } \
|
|
+ }
|
|
+#endif
|
|
--- a/gcc/config/rs6000/sysv4le.h
|
|
+++ b/gcc/config/rs6000/sysv4le.h
|
|
@@ -31,3 +31,5 @@
|
|
/* Little-endian PowerPC64 Linux uses the ELF v2 ABI by default. */
|
|
#define LINUX64_DEFAULT_ABI_ELFv2
|
|
|
|
+#undef MUSL_DYNAMIC_LINKER_E
|
|
+#define MUSL_DYNAMIC_LINKER_E ENDIAN_SELECT("","le","le")
|
|
--- a/gcc/config.gcc
|
|
+++ b/gcc/config.gcc
|
|
@@ -2416,6 +2416,10 @@ powerpc*-*-linux*)
|
|
powerpc*-*-linux*paired*)
|
|
tm_file="${tm_file} rs6000/750cl.h" ;;
|
|
esac
|
|
+ case ${target} in
|
|
+ *-linux*-musl*)
|
|
+ enable_secureplt=yes ;;
|
|
+ esac
|
|
if test x${enable_secureplt} = xyes; then
|
|
tm_file="rs6000/secureplt.h ${tm_file}"
|
|
fi
|