diff --git a/config.sub b/config.sub index 78176a4..c4a9252 100755 --- a/config.sub +++ b/config.sub @@ -125,6 +125,7 @@ esac maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ @@ -1346,6 +1347,7 @@ case $os in | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ + | -linux-musl* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ diff --git a/fixincludes/mkfixinc.sh b/fixincludes/mkfixinc.sh index 89e8ab7..a3d0787 100755 --- a/fixincludes/mkfixinc.sh +++ b/fixincludes/mkfixinc.sh @@ -20,7 +20,8 @@ case $machine in powerpc-*-eabi* | \ powerpc-*-rtems* | \ powerpcle-*-eabisim* | \ - powerpcle-*-eabi* ) + powerpcle-*-eabi* | \ + *-musl* ) # IF there is no include fixing, # THEN create a no-op fixer and exit (echo "#! /bin/sh" ; echo "exit 0" ) > ${target} diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index c42c087..36334fe 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -68,9 +68,9 @@ int in_sizeof; /* The level of nesting inside "typeof". */ int in_typeof; -/* Nonzero if we've already printed a "missing braces around initializer" - message within this initializer. */ -static int missing_braces_mentioned; +/* Nonzero if we might need to print a "missing braces around + initializer" message within this initializer. */ +static int found_missing_braces; static int require_constant_value; static int require_constant_elements; @@ -6455,6 +6455,9 @@ static int constructor_nonconst; /* 1 if this constructor is erroneous so far. */ static int constructor_erroneous; +/* 1 if this constructor is the universal zero initializer { 0 }. */ +static int constructor_zeroinit; + /* Structure for managing pending initializer elements, organized as an AVL tree. */ @@ -6616,7 +6619,7 @@ start_init (tree decl, tree asmspec_tree ATTRIBUTE_UNUSED, int top_level) constructor_stack = 0; constructor_range_stack = 0; - missing_braces_mentioned = 0; + found_missing_braces = 0; spelling_base = 0; spelling_size = 0; @@ -6711,6 +6714,7 @@ really_start_incremental_init (tree type) constructor_type = type; constructor_incremental = 1; constructor_designated = 0; + constructor_zeroinit = 1; designator_depth = 0; designator_erroneous = 0; @@ -6908,11 +6912,8 @@ push_init_level (int implicit, struct obstack * braced_init_obstack) set_nonincremental_init (braced_init_obstack); } - if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned) - { - missing_braces_mentioned = 1; - warning_init (OPT_Wmissing_braces, "missing braces around initializer"); - } + if (implicit == 1) + found_missing_braces = 1; if (TREE_CODE (constructor_type) == RECORD_TYPE || TREE_CODE (constructor_type) == UNION_TYPE) @@ -7045,17 +7046,36 @@ pop_init_level (int implicit, struct obstack * braced_init_obstack) } } + switch (VEC_length (constructor_elt, constructor_elements)) + { + case 0: + /* Initialization with { } counts as zeroinit. */ + constructor_zeroinit = 1; + break; + case 1: + /* This might be zeroinit as well. */ + if (integer_zerop (VEC_index (constructor_elt, constructor_elements, + 0)->value)) + constructor_zeroinit = 1; + break; + default: + /* If the constructor has more than one element, it can't be { 0 }. */ + constructor_zeroinit = 0; + break; + } + + /* Warn when some structs are initialized with direct aggregation. */ + if (!implicit && found_missing_braces && warn_missing_braces + && !constructor_zeroinit) + warning_init (OPT_Wmissing_braces, + "missing braces around initializer"); + /* Warn when some struct elements are implicitly initialized to zero. */ if (warn_missing_field_initializers && constructor_type && TREE_CODE (constructor_type) == RECORD_TYPE && constructor_unfilled_fields) { - bool constructor_zeroinit = - (VEC_length (constructor_elt, constructor_elements) == 1 - && integer_zerop - (VEC_index (constructor_elt, constructor_elements, 0)->value)); - /* Do not warn for flexible array members or zero-length arrays. */ while (constructor_unfilled_fields && (!DECL_SIZE (constructor_unfilled_fields) @@ -8170,6 +8190,9 @@ process_init_element (struct c_expr value, bool implicit, designator_depth = 0; designator_erroneous = 0; + if (!implicit && value.value && !integer_zerop (value.value)) + constructor_zeroinit = 0; + /* Handle superfluous braces around string cst as in char x[] = {"foo"}; */ if (string_flag diff --git a/gcc/config.gcc b/gcc/config.gcc index 9503b96..747eba3 100644 --- a/gcc/config.gcc +++ b/gcc/config.gcc @@ -522,7 +522,7 @@ case ${target} in esac # Common C libraries. -tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3" +tm_defines="$tm_defines LIBC_GLIBC=1 LIBC_UCLIBC=2 LIBC_BIONIC=3 LIBC_MUSL=4" # Common parts for widely ported systems. case ${target} in @@ -625,6 +625,9 @@ case ${target} in *-*-*uclibc*) tm_defines="$tm_defines DEFAULT_LIBC=LIBC_UCLIBC" ;; + *-*-*musl*) + tm_defines="$tm_defines DEFAULT_LIBC=LIBC_MUSL" + ;; *) tm_defines="$tm_defines DEFAULT_LIBC=LIBC_GLIBC" ;; @@ -2091,6 +2094,10 @@ powerpc-*-linux* | powerpc64-*-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 diff --git a/gcc/config/alpha/linux.h b/gcc/config/alpha/linux.h index 38dbdb0..d475ca9 100644 --- a/gcc/config/alpha/linux.h +++ b/gcc/config/alpha/linux.h @@ -63,8 +63,16 @@ along with GCC; see the file COPYING3. If not see #ifdef SINGLE_LIBC #define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC) +#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC) +#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL) #else #define OPTION_GLIBC (linux_libc == LIBC_GLIBC) +#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC) +#define OPTION_BIONIC (linux_libc == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (linux_libc == LIBC_MUSL) #endif /* Determine whether the entire c99 runtime is present in the diff --git a/gcc/config/arm/linux-eabi.h b/gcc/config/arm/linux-eabi.h index 80bd825..f49a04c 100644 --- a/gcc/config/arm/linux-eabi.h +++ b/gcc/config/arm/linux-eabi.h @@ -64,6 +64,23 @@ #undef GLIBC_DYNAMIC_LINKER #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.3" +/* For ARM musl currently supports four dynamic linkers: + - ld-musl-arm.so.1 - for the EABI-derived soft-float ABI + - ld-musl-armhf.so.1 - for the EABI-derived hard-float ABI + - ld-musl-armeb.so.1 - for the EABI-derived soft-float ABI, EB + - ld-musl-armebhf.so.1 - for the EABI-derived hard-float ABI, EB + musl does not support the legacy OABI mode. + All the dynamic linkers live in /lib. + We default to soft-float, EL. */ +#undef MUSL_DYNAMIC_LINKER +#if TARGET_BIG_ENDIAN_DEFAULT +#define MUSL_DYNAMIC_LINKER_E "%{mlittle-endian:;:eb}" +#else +#define MUSL_DYNAMIC_LINKER_E "%{mbig-endian:eb}" +#endif +#define MUSL_DYNAMIC_LINKER \ + "/lib/ld-musl-arm" MUSL_DYNAMIC_LINKER_E "%{mfloat-abi=hard:hf}.so.1" + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to use the GNU/Linux version, not the generic BPABI version. */ #undef LINK_SPEC diff --git a/gcc/config/glibc-stdint.h b/gcc/config/glibc-stdint.h index 4f8fe07..9c33123 100644 --- a/gcc/config/glibc-stdint.h +++ b/gcc/config/glibc-stdint.h @@ -22,6 +22,12 @@ a copy of the GCC Runtime Library Exception along with this program; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see . */ +/* Systems using musl libc should use this header and make sure + OPTION_MUSL is defined correctly before using the TYPE macros. */ +#ifndef OPTION_MUSL +#define OPTION_MUSL 0 +#endif + #define SIG_ATOMIC_TYPE "int" #define INT8_TYPE "signed char" @@ -43,12 +49,12 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define UINT_LEAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int") #define INT_FAST8_TYPE "signed char" -#define INT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") -#define INT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") +#define INT_FAST16_TYPE (LONG_TYPE_SIZE == 64 && !OPTION_MUSL ? "long int" : "int") +#define INT_FAST32_TYPE (LONG_TYPE_SIZE == 64 && !OPTION_MUSL ? "long int" : "int") #define INT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "long long int") #define UINT_FAST8_TYPE "unsigned char" -#define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int") -#define UINT_FAST32_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "unsigned int") +#define UINT_FAST16_TYPE (LONG_TYPE_SIZE == 64 && !OPTION_MUSL ? "long unsigned int" : "unsigned int") +#define UINT_FAST32_TYPE (LONG_TYPE_SIZE == 64 && !OPTION_MUSL ? "long unsigned int" : "unsigned int") #define UINT_FAST64_TYPE (LONG_TYPE_SIZE == 64 ? "long unsigned int" : "long long unsigned int") #define INTPTR_TYPE (LONG_TYPE_SIZE == 64 ? "long int" : "int") diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h index 73681fe..f907adf 100644 --- a/gcc/config/i386/linux.h +++ b/gcc/config/i386/linux.h @@ -22,3 +22,6 @@ along with GCC; see the file COPYING3. If not see #define GNU_USER_LINK_EMULATION "elf_i386" #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" + +#undef MUSL_DYNAMIC_LINKER +#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-i386.so.1" diff --git a/gcc/config/i386/linux64.h b/gcc/config/i386/linux64.h index 5b0a212..cf361b2 100644 --- a/gcc/config/i386/linux64.h +++ b/gcc/config/i386/linux64.h @@ -31,3 +31,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define GLIBC_DYNAMIC_LINKER32 "/lib/ld-linux.so.2" #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld-linux-x86-64.so.2" #define GLIBC_DYNAMIC_LINKERX32 "/libx32/ld-linux-x32.so.2" + +#undef MUSL_DYNAMIC_LINKER32 +#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-i386.so.1" +#undef MUSL_DYNAMIC_LINKER64 +#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-x86_64.so.1" +#undef MUSL_DYNAMIC_LINKERX32 +#define MUSL_DYNAMIC_LINKERX32 "/lib/ld-musl-x32.so.1" diff --git a/gcc/config/i386/pmm_malloc.h b/gcc/config/i386/pmm_malloc.h index 0a9f2e2..9f8db5c 100644 --- a/gcc/config/i386/pmm_malloc.h +++ b/gcc/config/i386/pmm_malloc.h @@ -27,12 +27,13 @@ #include /* We can't depend on since the prototype of posix_memalign - may not be visible. */ + may not be visible and we can't pollute the namespace either. */ #ifndef __cplusplus -extern int posix_memalign (void **, size_t, size_t); +extern int _mm_posix_memalign (void **, size_t, size_t) #else -extern "C" int posix_memalign (void **, size_t, size_t) throw (); +extern "C" int _mm_posix_memalign (void **, size_t, size_t) throw () #endif +__asm__("posix_memalign"); static __inline void * _mm_malloc (size_t size, size_t alignment) @@ -42,7 +43,7 @@ _mm_malloc (size_t size, size_t alignment) return malloc (size); if (alignment == 2 || (sizeof (void *) == 8 && alignment == 4)) alignment = sizeof (void *); - if (posix_memalign (&ptr, alignment, size) == 0) + if (_mm_posix_memalign (&ptr, alignment, size) == 0) return ptr; else return NULL; diff --git a/gcc/config/linux.h b/gcc/config/linux.h index fb459e6..d95f8c5 100644 --- a/gcc/config/linux.h +++ b/gcc/config/linux.h @@ -33,10 +33,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC) #define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC) #define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL) #else #define OPTION_GLIBC (linux_libc == LIBC_GLIBC) #define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC) #define OPTION_BIONIC (linux_libc == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (linux_libc == LIBC_MUSL) #endif #define GNU_USER_TARGET_OS_CPP_BUILTINS() \ @@ -51,21 +55,25 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see } while (0) /* Determine which dynamic linker to use depending on whether GLIBC or - uClibc or Bionic is the default C library and whether - -muclibc or -mglibc or -mbionic has been passed to change the default. */ + uClibc or Bionic or musl is the default C library and whether + -muclibc or -mglibc or -mbionic or -mmusl has been passed to change + the default. */ -#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LD1, LD2, LD3) \ - "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:" LD1 "}}" +#define CHOOSE_DYNAMIC_LINKER1(LIBC1, LIBC2, LIBC3, LIBC4, LD1, LD2, LD3, LD4) \ + "%{" LIBC2 ":" LD2 ";:%{" LIBC3 ":" LD3 ";:%{" LIBC4 ":" LD4 ";:" LD1 "}}}" #if DEFAULT_LIBC == LIBC_GLIBC -#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ - CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", G, U, B) +#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \ + CHOOSE_DYNAMIC_LINKER1 ("mglibc", "muclibc", "mbionic", "mmusl", G, U, B, M) #elif DEFAULT_LIBC == LIBC_UCLIBC -#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ - CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", U, G, B) +#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \ + CHOOSE_DYNAMIC_LINKER1 ("muclibc", "mglibc", "mbionic", "mmusl", U, G, B, M) #elif DEFAULT_LIBC == LIBC_BIONIC -#define CHOOSE_DYNAMIC_LINKER(G, U, B) \ - CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", B, G, U) +#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \ + CHOOSE_DYNAMIC_LINKER1 ("mbionic", "mglibc", "muclibc", "mmusl", B, G, U, M) +#elif DEFAULT_LIBC == LIBC_MUSL +#define CHOOSE_DYNAMIC_LINKER(G, U, B, M) \ + CHOOSE_DYNAMIC_LINKER1 ("mmusl", "mglibc", "muclibc", "mbionic", M, G, U, B) #else #error "Unsupported DEFAULT_LIBC" #endif /* DEFAULT_LIBC */ @@ -82,29 +90,106 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #define BIONIC_DYNAMIC_LINKER32 "/system/bin/linker" #define BIONIC_DYNAMIC_LINKER64 "/system/bin/linker64" #define BIONIC_DYNAMIC_LINKERX32 "/system/bin/linkerx32" +/* Should be redefined for each target that supports musl. */ +#define MUSL_DYNAMIC_LINKER "/dev/null" +#define MUSL_DYNAMIC_LINKER32 "/dev/null" +#define MUSL_DYNAMIC_LINKER64 "/dev/null" +#define MUSL_DYNAMIC_LINKERX32 "/dev/null" #define GNU_USER_DYNAMIC_LINKER \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER, UCLIBC_DYNAMIC_LINKER, \ - BIONIC_DYNAMIC_LINKER) + BIONIC_DYNAMIC_LINKER, MUSL_DYNAMIC_LINKER) #define GNU_USER_DYNAMIC_LINKER32 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER32, UCLIBC_DYNAMIC_LINKER32, \ - BIONIC_DYNAMIC_LINKER32) + BIONIC_DYNAMIC_LINKER32, MUSL_DYNAMIC_LINKER32) #define GNU_USER_DYNAMIC_LINKER64 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKER64, UCLIBC_DYNAMIC_LINKER64, \ - BIONIC_DYNAMIC_LINKER64) + BIONIC_DYNAMIC_LINKER64, MUSL_DYNAMIC_LINKER64) #define GNU_USER_DYNAMIC_LINKERX32 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERX32, UCLIBC_DYNAMIC_LINKERX32, \ - BIONIC_DYNAMIC_LINKERX32) + BIONIC_DYNAMIC_LINKERX32, MUSL_DYNAMIC_LINKERX32) /* Determine whether the entire c99 runtime is present in the runtime library. */ #undef TARGET_C99_FUNCTIONS -#define TARGET_C99_FUNCTIONS (OPTION_GLIBC) +#define TARGET_C99_FUNCTIONS (OPTION_GLIBC || OPTION_MUSL) /* Whether we have sincos that follows the GNU extension. */ #undef TARGET_HAS_SINCOS -#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_BIONIC) +#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_MUSL || OPTION_BIONIC) /* Whether we have Bionic libc runtime */ #undef TARGET_HAS_BIONIC #define TARGET_HAS_BIONIC (OPTION_BIONIC) + +/* musl avoids problematic includes by rearranging the include directories. + * Unfortunately, this is mostly duplicated from cppdefault.c */ +#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_LOCAL \ + 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 diff --git a/gcc/config/linux.opt b/gcc/config/linux.opt index ba6b9f83..f5e94a9 100644 --- a/gcc/config/linux.opt +++ b/gcc/config/linux.opt @@ -28,5 +28,9 @@ Target Report RejectNegative Var(linux_libc,LIBC_GLIBC) Negative(muclibc) Use GNU C library muclibc -Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) Negative(mbionic) +Target Report RejectNegative Var(linux_libc,LIBC_UCLIBC) Negative(mmusl) Use uClibc C library + +mmusl +Target Report RejectNegative Var(linux_libc,LIBC_MUSL) Negative(mbionic) +Use musl C library diff --git a/gcc/config/microblaze/linux.h b/gcc/config/microblaze/linux.h index 3c13fab..50c44dc 100644 --- a/gcc/config/microblaze/linux.h +++ b/gcc/config/microblaze/linux.h @@ -20,10 +20,20 @@ . */ -#define DYNAMIC_LINKER "/lib/ld.so.1" +#define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" + +#if TARGET_BIG_ENDIAN_DEFAULT == 0 /* LE */ +#define MUSL_DYNAMIC_LINKER_E "%{mbig-endian:;:el}" +#else +#define MUSL_DYNAMIC_LINKER_E "%{mlittle-endian:el}" +#endif + +#undef MUSL_DYNAMIC_LINKER +#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-microblaze" MUSL_DYNAMIC_LINKER_E ".so.1" + #undef SUBTARGET_EXTRA_SPECS #define SUBTARGET_EXTRA_SPECS \ - { "dynamic_linker", DYNAMIC_LINKER } + { "dynamic_linker", GNU_USER_DYNAMIC_LINKER } #undef LINK_SPEC #define LINK_SPEC "%{shared:-shared} \ diff --git a/gcc/config/mips/linux.h b/gcc/config/mips/linux.h index bce9c17..0467591 100644 --- a/gcc/config/mips/linux.h +++ b/gcc/config/mips/linux.h @@ -19,3 +19,6 @@ along with GCC; see the file COPYING3. If not see . */ #define GLIBC_DYNAMIC_LINKER "/lib/ld.so.1" + +#undef MUSL_DYNAMIC_LINKER +#define MUSL_DYNAMIC_LINKER "/lib/ld-musl-mips%{EL:el}%{msoft-float:-sf}.so.1" diff --git a/gcc/config/mips/linux64.h b/gcc/config/mips/linux64.h index 6e92719..58c7927 100644 --- a/gcc/config/mips/linux64.h +++ b/gcc/config/mips/linux64.h @@ -27,7 +27,14 @@ along with GCC; see the file COPYING3. If not see #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld.so.1" #define GLIBC_DYNAMIC_LINKERN32 "/lib32/ld.so.1" #define UCLIBC_DYNAMIC_LINKERN32 "/lib32/ld-uClibc.so.0" + +#undef MUSL_DYNAMIC_LINKER32 +#define MUSL_DYNAMIC_LINKER32 "/lib/ld-musl-mips%{EL:el}%{msoft-float:-sf}.so.1" +#undef MUSL_DYNAMIC_LINKER64 +#define MUSL_DYNAMIC_LINKER64 "/lib/ld-musl-mips64%{EL:el}%{msoft-float:-sf}.so.1" +#define MUSL_DYNAMIC_LINKERN32 "/lib/ld-musl-mipsn32%{EL:el}%{msoft-float:-sf}.so.1" + #define BIONIC_DYNAMIC_LINKERN32 "/system/bin/linker32" #define GNU_USER_DYNAMIC_LINKERN32 \ CHOOSE_DYNAMIC_LINKER (GLIBC_DYNAMIC_LINKERN32, UCLIBC_DYNAMIC_LINKERN32, \ - BIONIC_DYNAMIC_LINKERN32) + BIONIC_DYNAMIC_LINKERN32, MUSL_DYNAMIC_LINKERN32) diff --git a/gcc/config/rs6000/linux.h b/gcc/config/rs6000/linux.h index 3367274..ef1cb1c 100644 --- a/gcc/config/rs6000/linux.h +++ b/gcc/config/rs6000/linux.h @@ -29,17 +29,25 @@ #ifdef SINGLE_LIBC #define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC) +#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC) +#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL) #else #define OPTION_GLIBC (linux_libc == LIBC_GLIBC) +#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC) +#define OPTION_BIONIC (linux_libc == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (linux_libc == LIBC_MUSL) #endif /* glibc has float and long double forms of math functions. */ #undef TARGET_C99_FUNCTIONS -#define TARGET_C99_FUNCTIONS (OPTION_GLIBC) +#define TARGET_C99_FUNCTIONS (OPTION_GLIBC || OPTION_MUSL) /* Whether we have sincos that follows the GNU extension. */ #undef TARGET_HAS_SINCOS -#define TARGET_HAS_SINCOS (OPTION_GLIBC) +#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_MUSL) #undef TARGET_OS_CPP_BUILTINS #define TARGET_OS_CPP_BUILTINS() \ diff --git a/gcc/config/rs6000/linux64.h b/gcc/config/rs6000/linux64.h index 7c516eb..d695038 100644 --- a/gcc/config/rs6000/linux64.h +++ b/gcc/config/rs6000/linux64.h @@ -162,20 +162,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 @@ -295,17 +299,25 @@ extern int dot_symbols; #ifdef SINGLE_LIBC #define OPTION_GLIBC (DEFAULT_LIBC == LIBC_GLIBC) +#define OPTION_UCLIBC (DEFAULT_LIBC == LIBC_UCLIBC) +#define OPTION_BIONIC (DEFAULT_LIBC == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (DEFAULT_LIBC == LIBC_MUSL) #else #define OPTION_GLIBC (linux_libc == LIBC_GLIBC) +#define OPTION_UCLIBC (linux_libc == LIBC_UCLIBC) +#define OPTION_BIONIC (linux_libc == LIBC_BIONIC) +#undef OPTION_MUSL +#define OPTION_MUSL (linux_libc == LIBC_MUSL) #endif /* glibc has float and long double forms of math functions. */ #undef TARGET_C99_FUNCTIONS -#define TARGET_C99_FUNCTIONS (OPTION_GLIBC) +#define TARGET_C99_FUNCTIONS (OPTION_GLIBC || OPTION_MUSL) /* Whether we have sincos that follows the GNU extension. */ #undef TARGET_HAS_SINCOS -#define TARGET_HAS_SINCOS (OPTION_GLIBC) +#define TARGET_HAS_SINCOS (OPTION_GLIBC || OPTION_MUSL) #undef TARGET_OS_CPP_BUILTINS #define TARGET_OS_CPP_BUILTINS() \ @@ -360,19 +372,32 @@ extern int dot_symbols; #define GLIBC_DYNAMIC_LINKER32 "/lib/ld.so.1" #define GLIBC_DYNAMIC_LINKER64 "/lib64/ld64.so.1" + +#define MUSL_DYNAMIC_LINKER32 \ + "/lib/ld-musl-powerpc" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1" +#define MUSL_DYNAMIC_LINKER64 \ + "/lib/ld-musl-powerpc64" MUSL_DYNAMIC_LINKER_E "%{msoft-float:-sf}.so.1" + #define UCLIBC_DYNAMIC_LINKER32 "/lib/ld-uClibc.so.0" #define UCLIBC_DYNAMIC_LINKER64 "/lib/ld64-uClibc.so.0" #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) #define LINK_OS_LINUX_SPEC32 "-m elf32ppclinux %{!shared: %{!static: \ diff --git a/gcc/config/rs6000/secureplt.h b/gcc/config/rs6000/secureplt.h index f41078d..2979d0b 100644 --- a/gcc/config/rs6000/secureplt.h +++ b/gcc/config/rs6000/secureplt.h @@ -18,3 +18,4 @@ along with GCC; see the file COPYING3. If not see . */ #define CC1_SECURE_PLT_DEFAULT_SPEC "-msecure-plt" +#define LINK_SECURE_PLT_DEFAULT_SPEC "--secure-plt" diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h index aed2a29..6814bb5 100644 --- a/gcc/config/rs6000/sysv4.h +++ b/gcc/config/rs6000/sysv4.h @@ -567,6 +567,10 @@ extern int fixuplabelno; #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 and set correct endian mode. */ #define CC1_SPEC "%{G*} %(cc1_cpu) \ %{mlittle|mlittle-endian: %(cc1_endian_little); \ @@ -604,6 +608,7 @@ extern int fixuplabelno; : %(link_start_default) }" #define LINK_START_DEFAULT_SPEC "" +#define LINK_SECURE_PLT_SPEC LINK_SECURE_PLT_DEFAULT_SPEC #undef LINK_SPEC #define LINK_SPEC "\ @@ -612,6 +617,7 @@ extern int fixuplabelno; %(link_shlib) \ %{!T*: %(link_start) } \ %(link_target) \ +%{!static: %{!mbss-plt: %(link_secure_plt)}} \ %(link_os)" /* Shared libraries are not default. */ @@ -802,17 +808,27 @@ extern int fixuplabelno; #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 "%{msoft-float:-sf}.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} \ @@ -938,6 +954,7 @@ ncrtn.o%s" { "cc1_endian_little", CC1_ENDIAN_LITTLE_SPEC }, \ { "cc1_endian_default", CC1_ENDIAN_DEFAULT_SPEC }, \ { "cc1_secure_plt_default", CC1_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 }, \ @@ -990,3 +1007,74 @@ ncrtn.o%s" #define TARGET_USES_SYSV4_OPT 1 #undef DBX_REGISTER_NUMBER + +/* 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_LOCAL \ + 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 diff --git a/gcc/config/rs6000/sysv4le.h b/gcc/config/rs6000/sysv4le.h index 1559777..d216357 100644 --- a/gcc/config/rs6000/sysv4le.h +++ b/gcc/config/rs6000/sysv4le.h @@ -34,3 +34,6 @@ #undef MULTILIB_DEFAULTS #define MULTILIB_DEFAULTS { "mlittle", "mcall-sysv" } + +#undef MUSL_DYNAMIC_LINKER_E +#define MUSL_DYNAMIC_LINKER_E ENDIAN_SELECT("","le","le") diff --git a/gcc/config/sh/linux.h b/gcc/config/sh/linux.h index 3dad514..0dfc865 100644 --- a/gcc/config/sh/linux.h +++ b/gcc/config/sh/linux.h @@ -45,6 +45,27 @@ along with GCC; see the file COPYING3. If not see #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +#if TARGET_ENDIAN_DEFAULT == MASK_LITTLE_ENDIAN +#define MUSL_DYNAMIC_LINKER_E "%{mb:eb}" +#else +#define MUSL_DYNAMIC_LINKER_E "%{!ml:eb}" +#endif + +#if TARGET_CPU_DEFAULT & (MASK_HARD_SH2A_DOUBLE | MASK_SH4) +/* "-nofpu" if any nofpu option is specified. */ +#define MUSL_DYNAMIC_LINKER_FP \ + "%{m1|m2|m2a-nofpu|m3|m4-nofpu|m4-100-nofpu|m4-200-nofpu|m4-300-nofpu|" \ + "m4-340|m4-400|m4-500|m4al:-nofpu}" +#else +/* "-nofpu" if none of the hard fpu options are specified. */ +#define MUSL_DYNAMIC_LINKER_FP "%{m2a|m4|m4-100|m4-200|m4-300|m4a:;:-nofpu}" +#endif + +#undef MUSL_DYNAMIC_LINKER +#define MUSL_DYNAMIC_LINKER \ + "/lib/ld-musl-sh" MUSL_DYNAMIC_LINKER_E MUSL_DYNAMIC_LINKER_FP \ + "%{mfdpic:-fdpic}.so.1" + #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2" #undef SUBTARGET_LINK_EMUL_SUFFIX diff --git a/gcc/configure b/gcc/configure index 0d8c5e7..695e7c4 100755 --- a/gcc/configure +++ b/gcc/configure @@ -26791,6 +26791,9 @@ if test "${gcc_cv_libc_provides_ssp+set}" = set; then : else gcc_cv_libc_provides_ssp=no case "$target" in + *-*-musl*) + # All versions of musl provide stack protector + gcc_cv_libc_provides_ssp=yes;; *-*-linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu) # glibc 2.4 and later provides __stack_chk_fail and # either __stack_chk_guard, or TLS access to stack guard canary. @@ -26824,6 +26827,7 @@ else # ) and for now # simply assert that glibc does provide this, which is true for all # realistically usable GNU/Hurd configurations. + # All supported versions of musl provide it as well gcc_cv_libc_provides_ssp=yes;; *-*-darwin* | *-*-freebsd*) ac_fn_c_check_func "$LINENO" "__stack_chk_fail" "ac_cv_func___stack_chk_fail" @@ -26906,6 +26910,9 @@ case "$target" in gcc_cv_target_dl_iterate_phdr=no fi ;; + *-linux-musl*) + gcc_cv_target_dl_iterate_phdr=yes + ;; esac if test x$gcc_cv_target_dl_iterate_phdr = xyes; then diff --git a/gcc/configure.ac b/gcc/configure.ac index a78a1d7..b6425ef 100644 --- a/gcc/configure.ac +++ b/gcc/configure.ac @@ -4669,6 +4669,9 @@ AC_CACHE_CHECK(__stack_chk_fail in target C library, gcc_cv_libc_provides_ssp, [gcc_cv_libc_provides_ssp=no case "$target" in + *-*-musl*) + # All versions of musl provide stack protector + gcc_cv_libc_provides_ssp=yes;; *-*-linux* | *-*-kfreebsd*-gnu | *-*-knetbsd*-gnu) [# glibc 2.4 and later provides __stack_chk_fail and # either __stack_chk_guard, or TLS access to stack guard canary. @@ -4702,6 +4705,7 @@ AC_CACHE_CHECK(__stack_chk_fail in target C library, # ) and for now # simply assert that glibc does provide this, which is true for all # realistically usable GNU/Hurd configurations. + # All supported versions of musl provide it as well gcc_cv_libc_provides_ssp=yes;; *-*-darwin* | *-*-freebsd*) AC_CHECK_FUNC(__stack_chk_fail,[gcc_cv_libc_provides_ssp=yes], @@ -4767,6 +4771,9 @@ case "$target" in gcc_cv_target_dl_iterate_phdr=no fi ;; + *-linux-musl*) + gcc_cv_target_dl_iterate_phdr=yes + ;; esac GCC_TARGET_TEMPLATE([TARGET_DL_ITERATE_PHDR]) if test x$gcc_cv_target_dl_iterate_phdr = xyes; then diff --git a/gcc/cp/cfns.gperf b/gcc/cp/cfns.gperf index ef1ed08..721c741 100644 --- a/gcc/cp/cfns.gperf +++ b/gcc/cp/cfns.gperf @@ -20,9 +20,7 @@ along with GCC; see the file COPYING3. If not see __inline #endif static unsigned int hash (const char *, unsigned int); -#ifdef __GNUC__ -__inline -#endif +static inline const char * libc_name_p (const char *, unsigned int); %} %% diff --git a/gcc/cp/cfns.h b/gcc/cp/cfns.h index 62cdfab..4a27a26 100644 --- a/gcc/cp/cfns.h +++ b/gcc/cp/cfns.h @@ -51,9 +51,7 @@ along with GCC; see the file COPYING3. If not see __inline #endif static unsigned int hash (const char *, unsigned int); -#ifdef __GNUC__ -__inline -#endif +static inline const char * libc_name_p (const char *, unsigned int); /* maximum key range = 391, duplicates = 0 */ @@ -122,12 +120,7 @@ hash (register const char *str, register unsigned int len) return hval + asso_values[(unsigned char)str[len - 1]]; } -#ifdef __GNUC__ -__inline -#ifdef __GNUC_STDC_INLINE__ -__attribute__ ((__gnu_inline__)) -#endif -#endif +static inline const char * libc_name_p (register const char *str, register unsigned int len) { diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 625fef2..159615f 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -595,7 +595,7 @@ Objective-C and Objective-C++ Dialects}. -mcpu=@var{cpu}} @emph{GNU/Linux Options} -@gccoptlist{-mglibc -muclibc -mbionic -mandroid @gol +@gccoptlist{-mglibc -muclibc -mmusl -mbionic -mandroid @gol -tno-android-cc -tno-android-ld} @emph{H8/300 Options} @@ -12879,13 +12879,19 @@ These @samp{-m} options are defined for GNU/Linux targets: @item -mglibc @opindex mglibc Use the GNU C library. This is the default except -on @samp{*-*-linux-*uclibc*} and @samp{*-*-linux-*android*} targets. +on @samp{*-*-linux-*uclibc*}, @samp{*-*-linux-*musl*} and +@samp{*-*-linux-*android*} targets. @item -muclibc @opindex muclibc Use uClibc C library. This is the default on @samp{*-*-linux-*uclibc*} targets. +@item -mmusl +@opindex mmusl +Use the musl C library. This is the default on +@samp{*-*-linux-*musl*} targets. + @item -mbionic @opindex mbionic Use Bionic C library. This is the default on diff --git a/gcc/gcc.c b/gcc/gcc.c index 939dcc8..a3b0912 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -603,7 +603,7 @@ proper position among the other output files. */ #ifndef LINK_SSP_SPEC #ifdef TARGET_LIBC_PROVIDES_SSP -#define LINK_SSP_SPEC "%{fstack-protector:}" +#define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared}" #else #define LINK_SSP_SPEC "%{fstack-protector|fstack-protector-all:-lssp_nonshared -lssp}" #endif diff --git a/libgcc/config/arm/linux-atomic-64bit.c b/libgcc/config/arm/linux-atomic-64bit.c index af94c7f..36570e5 100644 --- a/libgcc/config/arm/linux-atomic-64bit.c +++ b/libgcc/config/arm/linux-atomic-64bit.c @@ -33,7 +33,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see kernels; we check for that in an init section and bail out rather unceremoneously. */ -extern unsigned int __write (int fd, const void *buf, unsigned int count); +extern int write (int fd, const void *buf, unsigned int count); extern void abort (void); /* Kernel helper for compare-and-exchange. */ @@ -56,7 +56,7 @@ static void __check_for_sync8_kernelhelper (void) for the user - I'm not sure I can rely on much else being available at this point, so do the same as generic-morestack.c write () and abort (). */ - __write (2 /* stderr. */, err, sizeof (err)); + write (2 /* stderr. */, err, sizeof (err)); abort (); } }; diff --git a/libgcc/config/rs6000/linux-unwind.h b/libgcc/config/rs6000/linux-unwind.h index 13bf413..9cc3af1 100644 --- a/libgcc/config/rs6000/linux-unwind.h +++ b/libgcc/config/rs6000/linux-unwind.h @@ -182,6 +182,7 @@ get_regs (struct _Unwind_Context *context) static long ppc_linux_aux_vector (long which) { +#ifdef __GLIBC__ /* __libc_stack_end holds the original stack passed to a process. */ extern long *__libc_stack_end; long argc; @@ -206,6 +207,10 @@ ppc_linux_aux_vector (long which) if (auxp->a_type == which) return auxp->a_val; return 0; +#else + extern unsigned long getauxval(unsigned long); + return getauxval(which); +#endif } /* Do code reading to identify a signal frame, and set the frame diff --git a/libgcc/unwind-dw2-fde-dip.c b/libgcc/unwind-dw2-fde-dip.c index a048495..0a71e31 100644 --- a/libgcc/unwind-dw2-fde-dip.c +++ b/libgcc/unwind-dw2-fde-dip.c @@ -54,6 +54,12 @@ #endif #if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \ + && defined(TARGET_DL_ITERATE_PHDR) \ + && defined(__linux__) +# define USE_PT_GNU_EH_FRAME +#endif + +#if !defined(inhibit_libc) && defined(HAVE_LD_EH_FRAME_HDR) \ && defined(__FreeBSD__) && __FreeBSD__ >= 7 # define ElfW __ElfN # define USE_PT_GNU_EH_FRAME diff --git a/libgfortran/acinclude.m4 b/libgfortran/acinclude.m4 index 645b248..73203b9 100644 --- a/libgfortran/acinclude.m4 +++ b/libgfortran/acinclude.m4 @@ -99,7 +99,7 @@ void foo (void); [Define to 1 if the target supports #pragma weak]) fi case "$host" in - *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | alpha*-dec-osf* ) + *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | alpha*-dec-osf* | *-*-musl* ) AC_DEFINE(GTHREAD_USE_WEAK, 0, [Define to 0 if the target shouldn't use #pragma weak]) ;; diff --git a/libgfortran/configure b/libgfortran/configure index 227f556..c4abe04 100755 --- a/libgfortran/configure +++ b/libgfortran/configure @@ -25564,7 +25564,7 @@ $as_echo "#define SUPPORTS_WEAK 1" >>confdefs.h fi case "$host" in - *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | alpha*-dec-osf* ) + *-*-darwin* | *-*-hpux* | *-*-cygwin* | *-*-mingw* | alpha*-dec-osf* | *-*-musl* ) $as_echo "#define GTHREAD_USE_WEAK 0" >>confdefs.h diff --git a/libitm/config/arm/hwcap.cc b/libitm/config/arm/hwcap.cc index 007c10e..e35dbfb 100644 --- a/libitm/config/arm/hwcap.cc +++ b/libitm/config/arm/hwcap.cc @@ -40,7 +40,7 @@ int GTM_hwcap HIDDEN = 0 #ifdef __linux__ #include -#include +#include #include static void __attribute__((constructor)) diff --git a/libitm/config/linux/x86/tls.h b/libitm/config/linux/x86/tls.h index 01f7c27..7fcafa8 100644 --- a/libitm/config/linux/x86/tls.h +++ b/libitm/config/linux/x86/tls.h @@ -25,16 +25,19 @@ #ifndef LIBITM_X86_TLS_H #define LIBITM_X86_TLS_H 1 -#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10) +#if defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2, 10) /* Use slots in the TCB head rather than __thread lookups. GLIBC has reserved words 10 through 13 for TM. */ #define HAVE_ARCH_GTM_THREAD 1 #define HAVE_ARCH_GTM_THREAD_DISP 1 #endif +#endif #include "config/generic/tls.h" -#if defined(__GLIBC_PREREQ) && __GLIBC_PREREQ(2, 10) +#if defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2, 10) namespace GTM HIDDEN { #ifdef __x86_64__ @@ -101,5 +104,6 @@ static inline void set_abi_disp(struct abi_dispatch *x) } // namespace GTM #endif /* >= GLIBC 2.10 */ +#endif #endif // LIBITM_X86_TLS_H diff --git a/libstdc++-v3/config/os/generic/os_defines.h b/libstdc++-v3/config/os/generic/os_defines.h index 3199bf3..b8d7c16 100644 --- a/libstdc++-v3/config/os/generic/os_defines.h +++ b/libstdc++-v3/config/os/generic/os_defines.h @@ -33,4 +33,9 @@ // System-specific #define, typedefs, corrections, etc, go here. This // file will come before all others. +// Disable the weak reference logic in gthr.h for os/generic because it +// is broken on every platform unless there is implementation specific +// workaround in gthr-posix.h and at link-time for static linking. +#define _GLIBCXX_GTHREAD_USE_WEAK 0 + #endif diff --git a/libstdc++-v3/configure.host b/libstdc++-v3/configure.host index b0e2cd9..df79771 100644 --- a/libstdc++-v3/configure.host +++ b/libstdc++-v3/configure.host @@ -242,6 +242,9 @@ case "${host_os}" in freebsd*) os_include_dir="os/bsd/freebsd" ;; + linux-musl*) + os_include_dir="os/generic" + ;; gnu* | linux* | kfreebsd*-gnu | knetbsd*-gnu) if [ "$uclibc" = "yes" ]; then os_include_dir="os/uclibc"