[cfe-users] Seg fault building with clang++ and -femulated-tls against gcc std lib

2020-01-14 Thread Dave Gittins via cfe-users
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 
#include 
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


Re: [cfe-users] Seg fault building with clang++ and -femulated-tls against gcc std lib

2020-01-14 Thread Dave Gittins via cfe-users
Update: I believe this is resolved by adding -lgcc_s.1 to the build
command. (gcc does this automatically)

So in case anyone else runs into this, here is my working build
command to build with clang on OSX against the gcc 7.5 std lib:

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  -femulated-tls -lgcc_s.1 example.cpp -o example
On Wed, 8 Jan 2020 at 10:45, Dave Gittins  wrote:
>
> 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 
> #include 
> 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