Recentemente abbiamo rilevato un rapporto a causa di GCC 5.1, libstdc++ and Dual ABI. Sembra Clang is not aware of the GCC inline namespace changes, quindi genera codice basato su un set di spazi dei nomi o simboli, mentre GCC usa un altro set di spazi dei nomi o simboli. Al momento del collegamento, ci sono problemi dovuti a simboli mancanti.Collegamento di problemi dovuti ai simboli con abi :: cxx11?
Se sto analizzando correttamente la pagina Dual ABI, sembra una questione di rotazione su _GLIBCXX_USE_CXX11_ABI
e abi::cxx11
con alcune difficoltà aggiuntive. Ulteriori letture sono disponibili sul blog di Red Hat allo GCC5 and the C++11 ABI e allo The Case of GCC-5.1 and the Two C++ ABIs.
Di seguito è riportato da una macchina Ubuntu 15. La macchina fornisce 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]
Come faccio a generare un file binario con i simboli che utilizzano entrambe le decorazioni ("coesistenza", come il blog di Red Hat chiama)?
Oppure, quali sono le opzioni disponibili?
Sto cercando di ottenere un "funziona solo" per gli utenti. Non mi interessa se ci sono due simboli deboli con due comportamenti diversi (std::string
manca copy-on-write, mentre std::string[abi:cxx11]
fornisce copy-on-write). Oppure, uno può essere un alias per l'altro.
Debian ha un carico di errori simili a Debian Bug report logs: Bugs tagged libstdc++-cxx11. La loro soluzione consisteva nel ricostruire tutto sotto il nuovo ABI, ma non gestiva il caso d'angolo dei compilatori di compilazione/adattamento che l'ABI cambiava.
Nel mondo Apple, penso che questo sia vicino a un binario grasso. Ma non sono sicuro di cosa fare nel mondo Linux/GCC. Infine, non controlliamo il modo in cui la distribuzione genera la libreria e non controlliamo quali compilatori vengono utilizzati per collegare un'applicazione alla libreria.
Qual è il tuo prodotto? Una biblioteca o un programma? –
@ n.m. - Il prodotto è di Wei Dai [Crypto ++] (http://www.cryptopp.com/). È una libreria C++. È costruito da Debian e fornito come parte della distribuzione. – jww