[patch] Implement move semantics for iostreams

Jonathan Wakely jwakely@redhat.com
Wed Sep 24 14:48:00 GMT 2014


On 24/09/14 16:38 +0200, Rainer Orth wrote:
>Hi Jonathan,
>
>> On 23/09/14 15:58 +0200, Rainer Orth wrote:
>>>This patch broke Solaris bootstrap with Sun ld: when linking
>>>libstdc++.so, ld complains
>>>
>>>ld: fatal: libstdc++-symbols.ver-sun: 4520: symbol 'std::basic_ios<char,
>>> std::char_traits<char> >::move(std::basic_ios<char,
>>> std::char_traits<char> >&&)': symbol version conflict
>>>
>>>and many more.  In that case, I find that this symbols is matched by
>>>both the GLIBCXX_3.4 and GLIBCXX_3.4.21 patterns:
>>>
>>>    GLIBCXX_3.4
>>>    ##std::basic_i[g-r]* (cxx)
>>>    _ZNSt9basic_iosIcSt11char_traitsIcEE4moveEOS2_;
>>>
>>>    GLIBCXX_3.4.21
>>>    ##_ZNSt9basic_iosI[cw]St11char_traitsI[cw]EE4moveE[OR]S2_ (glob)
>>>    _ZNSt9basic_iosIcSt11char_traitsIcEE4moveEOS2_;
>>
>> Rainer, I think this patch should fix it, could you test it please?
>
>almost there: now I only get
>
>ld: fatal: libstdc++-symbols.ver-sun: 4622: symbol 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::basic_ostream(std::basic_iostream<wchar_t, std::char_traits<wchar_t> >&)': symbol version conflict
>ld: fatal: libstdc++-symbols.ver-sun: 4623: symbol 'std::basic_ostream<wchar_t, std::char_traits<wchar_t> >::basic_ostream(std::basic_iostream<wchar_t, std::char_traits<wchar_t> >&)': symbol version conflict
>
>from
>
>  GLIBCXX_3.4:
>
>    ##_ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]E[RP]* (glob)
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1ERSt14basic_iostreamIwS1_E;
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC2ERSt14basic_iostreamIwS1_E;
>
>  GLIBCXX_3.4.21:
>
>    ##_ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]ERSt14basic_iostreamIwS1_E (glob)
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1ERSt14basic_iostreamIwS1_E;
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC2ERSt14basic_iostreamIwS1_E;

Doh, yes, this additional tweak should solve that:

index f736240..95fc3c7 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -460,7 +460,7 @@ GLIBCXX_3.4 {
 
     # std::basic_ostream<wchar_t>
     _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]Ev;
-    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]E[RP]*;
+    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC[12]EP*;
     _ZNSt13basic_ostreamIwSt11char_traitsIwEED*;
     _ZNKSt13basic_ostreamIwSt11char_traitsIwEE[0-9][a-z]*;
     _ZNSt13basic_ostreamIwSt11char_traitsIwEE3putEw;

>The glob in the 3.4 version also matches
>
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC1EPSt15basic_streambufIwS1_E;
>    _ZNSt13basic_ostreamIwSt11char_traitsIwEEC2EPSt15basic_streambufIwS1_E;

Yes, that's all it needs to match, so changing [RP] to just P should work.

>> (I tried installing Solaris in a VM but couldn't get it to work, maybe
>> I should use the VirtualBox image instead of trying qemu/kvm.)
>
>VirtualBox works for me in principle, but I often found bootstrapping
>gcc inside some VM almost intolerably slow...  There's been some talk on
>getting Solaris up and running in the compile farm.

That would be very useful.

Thanks for the quick testing and analysis.



More information about the Libstdc++ mailing list