I am having a problem building on OSX with clang, against the gcc
standard library (there are project constraints behind why I am doing
this). I am using homebrew packages for both clang and gcc. This
pattern worked fine until a recent gcc package upgrade and I would at
least like to understand better what has happened.

Here's my example.cpp:
#include <mutex>
#include <iostream>
int main()
{
    std::once_flag flag;
    std::call_once(flag, [](){ std::cout << "Foo\n"; });
    return 0;
}

Now if I brew install llvm 7.1.0 and gcc 7.5.0, I can successfully
build as follows:
> /usr/local/Cellar/llvm@7/7.1.0_1/bin/clang++ -isystem 
> /usr/local/Cellar/gcc@7/7.5.0/include/c++/7.5.0 -isystem 
> /usr/local/Cellar/gcc@7/7.5.0/include/c++/7.5.0/x86_64-apple-darwin18.7.0 
> -isystem /usr/local/Cellar/gcc@7/7.5.0/include/c++/7.5.0/backward -L 
> /usr/local/Cellar/gcc@7/7.5.0/lib/gcc/7 -nostdinc++ -stdlib=libstdc++ 
> -std=c++17 example.cpp -o example -femulated-tls

I have to add -femulated-tls, because we need to link to symbols such
as ___emutls_v._ZSt11__once_call in the gcc std lib (without this
option, it fails to link because it can't find _ZSt11__once_call).

However this fails at runtime:
> ./example
Segmentation fault: 11 (core dumped)

I am not sure where to go next with this!


Some other notes:
* Building this example with gcc 7.5.0 against its own std lib works fine.
* Building this example against the std lib from gcc 7.4.0 (without
-femulated-tls) works fine, because that gcc version was built with
_GLIBCXX_HAVE_TLS not defined and therefore uses a different
implementation of std::once_call. I am still not sure if this change
in the gcc package is intentional (have asked on gcc mailing list).


Any help would be very much appreciated!

Thanks
Dave
_______________________________________________
cfe-users mailing list
cfe-users@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-users

Reply via email to