aboutsummaryrefslogtreecommitdiff
path: root/gcc/common
diff options
context:
space:
mode:
authorSören Tempel <soeren@soeren-tempel.net>2022-01-21 19:22:46 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2022-01-21 19:22:46 +0000
commitc163647ffbc9a20c8feb6e079dbecccfe016c82e (patch)
treec690fbf0f1c2c425ab0d533eb7db6df6d954ba1d /gcc/common
parentafe91e2566f47a6041f45095a48fc255625cb468 (diff)
downloadgcc-c163647ffbc9a20c8feb6e079dbecccfe016c82e.zip
gcc-c163647ffbc9a20c8feb6e079dbecccfe016c82e.tar.gz
gcc-c163647ffbc9a20c8feb6e079dbecccfe016c82e.tar.bz2
Disable -fsplit-stack support on non-glibc targets
The -fsplit-stack option requires the pthread_t TCB definition in the libc to provide certain struct fields at specific hardcoded offsets. As far as I know, only glibc provides these fields at the required offsets. Most notably, musl libc does not have these fields. However, since gcc accesses the fields using a fixed offset, this does not cause a compile-time error, but instead results in a silent memory corruption at run-time with musl libc. For example, on s390x libgcc's __stack_split_initialize CTOR will overwrite the cancel field in the pthread_t TCB on musl. The -fsplit-stack option is used within the gcc code base itself by gcc-go (if available). On musl-based systems with split-stack support (i.e. s390x or x86) this causes Go programs compiled with gcc-go to misbehave at run-time. This patch fixes gcc-go on musl by disabling -fsplit-stack in gcc itself since it is not supported on non-glibc targets anyhow. This is achieved by checking if gcc targets a glibc-based system. This check has been added for x86 and s390x, the rs6000 config already checks for TARGET_GLIBC_MAJOR. Other architectures do not have split-stack support. With this patch applied, the gcc-go configure script will detect that -fsplit-stack support is not available and will not use it. See https://www.openwall.com/lists/musl/2012/10/16/12 This patch was written under the assumption that glibc is the only libc implementation which supports the required fields at the required offsets in the pthread_t TCB. The patch has been tested on Alpine Linux Edge on the s390x and x86 architectures by bootstrapping Google's Go implementation with gcc-go. Signed-off-by: Sören Tempel <soeren@soeren-tempel.net> gcc/ChangeLog: * common/config/s390/s390-common.cc (s390_supports_split_stack): Only support split-stack on glibc targets. * config/i386/gnu-user-common.h (STACK_CHECK_STATIC_BUILTIN): Ditto. * config/i386/gnu.h (defined): Ditto.
Diffstat (limited to 'gcc/common')
-rw-r--r--gcc/common/config/s390/s390-common.cc14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/common/config/s390/s390-common.cc b/gcc/common/config/s390/s390-common.cc
index 6ed2f89..547b082 100644
--- a/gcc/common/config/s390/s390-common.cc
+++ b/gcc/common/config/s390/s390-common.cc
@@ -116,13 +116,19 @@ s390_handle_option (struct gcc_options *opts ATTRIBUTE_UNUSED,
/* -fsplit-stack uses a field in the TCB, available with glibc-2.23.
We don't verify it, since earlier versions just have padding at
- its place, which works just as well. */
+ its place, which works just as well. For other libc implementations
+ we disable the feature entirely to avoid corrupting the TCB. */
static bool
-s390_supports_split_stack (bool report ATTRIBUTE_UNUSED,
- struct gcc_options *opts ATTRIBUTE_UNUSED)
+s390_supports_split_stack (bool report,
+ struct gcc_options *opts)
{
- return true;
+ if (opts->x_linux_libc == LIBC_GLIBC)
+ return true;
+
+ if (report)
+ error ("%<-fsplit-stack%> currently only supported on GNU/Linux");
+ return false;
}
#undef TARGET_DEFAULT_TARGET_FLAGS