https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100114
--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
const vars in C++ can't be uninitialized nor modified.
And initializing those in constructor or .init_array is too late, the problem
is
that the function is called from .preinit_array handler, so before anything is
constructed.
I'd suggest
--- libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp.jj
2020-11-13 19:00:46.909618582 +0100
+++ libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp 2021-04-16
15:19:56.211942944 +0200
@@ -165,7 +165,13 @@ bool SupportsColoredOutput(fd_t fd) {
#if !SANITIZER_GO
// TODO(glider): different tools may require different altstack size.
+#if SANITIZER_LINUX && defined(_SC_SIGSTKSZ)
+// In glibc 2.34 and later SIGSTKSZ is no longer a compile time constant,
+// but sysconf (_SC_SIGSTKSZ) call.
+static uptr kAltStackSize;
+#else
static const uptr kAltStackSize = SIGSTKSZ * 4; // SIGSTKSZ is not enough.
+#endif
void SetAlternateSignalStack() {
stack_t altstack, oldstack;
@@ -173,6 +179,9 @@ void SetAlternateSignalStack() {
// If the alternate stack is already in place, do nothing.
// Android always sets an alternate stack, but it's too small for us.
if (!SANITIZER_ANDROID && !(oldstack.ss_flags & SS_DISABLE)) return;
+#if SANITIZER_LINUX && defined(_SC_SIGSTKSZ)
+ if (!kAltStackSize) kAltStackSize = SIGSTKSZ * 4;
+#endif
// TODO(glider): the mapped stack should have the MAP_STACK flag in the
// future. It is not required by man 2 sigaltstack now (they're using
// malloc()).