https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110432
Bug ID: 110432
Summary: macOS: Segmentation fault when using stdlibc++ from
gcc 13.1 in combination with clang-16
Product: gcc
Version: 13.1.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: sascha.scandella at dentsplysirona dot com
Target Milestone: ---
As you certainly all know GCC has changed the way how the global iostream
objects are created since gcc 13.1. This can be found on the official page.
"For C++, construction of the global iostream objects std::cout, std::cin, etc.
is now done inside the standard library, instead of in every source file that
includes the header. This change improves the start-up performance of C++
programs, but it means that code compiled with GCC 13.1 will crash if the
correct version of libstdc++.so is not used at runtime. See the documentation
about using the right libstdc++.so at runtime. Future GCC releases will
mitigate the problem so that the program cannot be run at all with an older
libstdc++.so."
More details can also be found here:
https://developers.redhat.com/articles/2023/04/03/leaner-libstdc-gcc-13
On macOS SUPPORTS_INIT_PRIORITY within gcc is set to 0. This means that the
global iostream object is not initialized and the fallback will be taken (i.e.
static initialization of the iostream object).
The problem is that when the iostream include is used, the expression
__has_attribute(__init_priority__) is true, since clang-16 supports
__init_priority__ and the static initialization is not done. See here:
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/std/iostream#L78
This leads to a segmentation fault with a simple sample application when using
clang-16 in combination with stdlibc++.
Sample application:
#include
int main()
{
std::cout << "Hello" << std::endl;
}
$HOMEBREW_PREFIX/opt/llvm@16/bin/clang++ \
-v \
-stdlib=libstdc++ \
-stdlib++-isystem $HOMEBREW_PREFIX/opt/gcc@13/include/c++/13 \
-cxx-isystem $HOMEBREW_PREFIX/opt/gcc@13/include/c++/13/x86_64-apple-darwin22
\
-L $HOMEBREW_PREFIX/opt/gcc@13/lib/gcc/13/ \
-L $HOMEBREW_PREFIX/opt/llvm/lib \
-o test main.cpp
Execute test -> segfault.
➜ ~ ./test
[1]7965 segmentation fault ./test
Would it be possible to change the #if statement such that it would also work
on macOS when using clang in combination with the stdlibc++?
#if !__has_attribute(__init_priority__)
static ios_base::Init __ioinit;
#elif defined(_GLIBCXX_SYMVER_GNU)
__extension__ __asm (".globl _ZSt21ios_base_library_initv");
#endif
Remarks: When compiling with gcc everything works as expected since the
iostream object gets initialized properly with the fallback.
gcc -v
Using built-in specs.
COLLECT_GCC=gcc-13
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/13.1.0/bin/../libexec/gcc/x86_64-apple-darwin22/13/lto-wrapper
Target: x86_64-apple-darwin22
Configured with: ../configure --prefix=/usr/local/opt/gcc
--libdir=/usr/local/opt/gcc/lib/gcc/current --disable-nls
--enable-checking=release --with-gcc-major-version-only
--enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-13
--with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr
--with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl
--with-zstd=/usr/local/opt/zstd --with-pkgversion='Homebrew GCC 13.1.0'
--with-bugurl=https://github.com/Homebrew/homebrew-core/issues
--with-system-zlib --build=x86_64-apple-darwin22
--with-sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX13.sdk
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 13.1.0 (Homebrew GCC 13.1.0)
OS: macOS Ventura 13.4 (Intel)