Niedawno otrzymaliśmy zgłoszenie z powodu GCC 5.1, libstdc++ and Dual ABI. Wydaje się, że Clang is not aware of the GCC inline namespace changes generuje kod oparty na jednym zestawie przestrzeni nazw lub symboli, podczas gdy GCC używa innego zestawu przestrzeni nazw lub symboli. W czasie połączenia występują problemy z powodu brakujących symboli.Łączenie problemów z powodu symboli z abi :: cxx11?
Jeśli poprawnie analizuję stronę Dual ABI, wygląda na to, że obracanie się pod numerami _GLIBCXX_USE_CXX11_ABI
i abi::cxx11
wymaga dodatkowych trudności. Więcej czytania jest dostępne na blogu Red Hata pod numerem GCC5 and the C++11 ABI i The Case of GCC-5.1 and the Two C++ ABIs.
Poniżej znajduje się na komputerze Ubuntu 15. Maszyna zapewnia GCC 5.2.1.
$ 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]
Jak mogę wygenerować binarny z symboli z wykorzystaniem zarówno dekoracje („współistnienia”, jak blog Red Hat to nazywa)?
Lub, jakie są dostępne opcje?
Próbuję osiągnąć "po prostu działa" dla użytkowników. Nie obchodzi mnie, czy istnieją dwa słabe symbole z dwoma różnymi zachowaniami (std::string
brakuje kopii na zapis, a std::string[abi:cxx11]
zapewnia kopiowanie przy zapisie). Albo może być alias dla drugiego.
Debian ma mnóstwo podobnych robaków pod adresem Debian Bug report logs: Bugs tagged libstdc++-cxx11. Ich rozwiązaniem było przebudowanie wszystkiego w ramach nowego ABI, ale nie poradziło sobie z narożnym przypadkiem mieszania/dopasowywania kompilatorów modulo do zmian ABI.
W świecie Apple uważam, że jest blisko grubego pliku binarnego. Ale nie jestem pewien, co zrobić w świecie Linuksa/GCC. Na koniec nie kontrolujemy sposobu, w jaki dystrybucje budują bibliotekę, i nie kontrolujemy, które kompilatory są używane do łączenia aplikacji z biblioteką.
Jaki jest Twój produkt? Biblioteka lub program? –
@ n.m. - Produkt jest produktem Wei Dai [Crypto ++] (http://www.cryptopp.com/). Jest to biblioteka C++. Jest zbudowany przez Debiana i dostarczany jako część dystrybucji. – jww