Мы недавно поймали отчет из-за GCC 5.1, libstdc++ and Dual ABI. Кажется Clang is not aware of the GCC inline namespace changes, поэтому он генерирует код на основе одного набора пространств имен или символов, тогда как GCC использует другой набор пространств имен или символов. Во время соединения возникают проблемы из-за отсутствия символов.Устранение проблем, связанных с символами с помощью abi :: cxx11?
Если я правильно разобрал страницу Dual ABI, это выглядит как поворот на _GLIBCXX_USE_CXX11_ABI
и abi::cxx11
с некоторыми дополнительными трудностями. Более подробное чтение доступно в блоге Red Hat по адресу GCC5 and the C++11 ABI и The Case of GCC-5.1 and the Two C++ ABIs.
Ниже приведено устройство Ubuntu 15. Машина обеспечивает 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]
Как я могу генерировать двоичный с символами, используя как декорации («сосуществование», как блог Red Hat называет это)?
Или, какие у нас варианты?
Я пытаюсь достичь «он просто работает» для пользователей. Меня не волнует, есть ли два слабых символа с двумя разными типами поведения (std::string
не хватает копий-на-запись, а std::string[abi:cxx11]
обеспечивает копирование на запись). Или, может быть, псевдоним для другого.
У Debian есть лодка похожих ошибок на Debian Bug report logs: Bugs tagged libstdc++-cxx11. Их решение состояло в том, чтобы перестроить все под новым ABI, но он не обрабатывал угловой случай смешивания/сопоставления компиляторов по модулю изменений ABI.
В мире Apple, я думаю, что это близко к жирному двоичному. Но я не уверен, что делать в мире Linux/GCC. Наконец, мы не контролируем, как дистрибутив создает библиотеку, и мы не контролируем, какие компиляторы используются для связывания приложений с библиотекой.
Ваш продукт? Библиотека или программа? –
@ н.м. - продукт Wei Dai's [Crypto ++] (http://www.cryptopp.com/). Его библиотека C++. Его построено Debian и поставляется как часть дистрибутива. – jww