How to provide coexisting std::string's (with and without abi:cxx11) in GCC 5.1 and above?
Marc Glisse
marc.glisse@inria.fr
Thu Mar 24 12:08:00 GMT 2016
On Thu, 24 Mar 2016, Jeffrey Walton wrote:
>>> Please forgive my ignorance... What is the "coexistence" that is
>>> discussed? Naively, I thought it would have been something like this
>>> contrived example:
>>>
>>> $ cat test.cxx
>>> #include <string>
>>>
>>> std::string foo __attribute__ ((visibility ("default")));
>>> std::string bar __attribute__ ((visibility ("default")));
>>>
>>> $ g++ -g3 -O2 -shared test.cxx -o test.so
>>>
>>> $ nm test.so | grep _Z3
>>> ...
>>> 0000201c B _Z3barB5cxx11
>>> 00002034 B _Z3fooB5cxx11
>>>
>>> $ echo _Z3fooB5cxx11 _Z3barB5cxx11 | c++filt
>>> foo[abi:cxx11] bar[abi:cxx11]
>>> foo bar
>>>
>>> In the above contrived example, foo and bar are in both namespaces.
>>> That is, the symbol coexists and "things just work".
>>
>> Consider the following example:
>>
>> markus@x4 /tmp % cat test.cpp
>> #include <string>
>>
>> struct Test {
>> __attribute__((used)) std::string foo() { return "foo"; };
>> };
>>
>> markus@x4 /tmp % g++ -c test.cpp && nm test.o | grep _ZN4Test
>> 0000000000000000 W _ZN4Test3fooB5cxx11Ev
>> markus@x4 /tmp % clang++ -c test.cpp && nm test.o | grep _ZN4Test
>> 0000000000000000 W _ZN4Test3fooEv
>
> Exactly! How do I get both _ZN4Test3fooB5cxx11Ev and _ZN4Test3fooEv
> into the shared object so both GCC and Clang "just work". I thought
> that's what "coexistence" meant, but it appears to mean something else
> (that I have not been able to nail down).
You compile one object file using one compiler/ABI and another one using
the other ABI, then link them both...
(sorry, I did try to argue against this whole situation but failed)
--
Marc Glisse
More information about the Gcc-help
mailing list