но так как это генерирует С++ компилятор, то напишу в этот.
Делаю я тут один PR в oneTBB и на macOS всплыла очень странная проблема.
typeinfo для классов, если я собираю код clang'ом из xcode имеют тип символов S в выводе nm.
typeinfo для этих же самых классов в onetbb, которая собрана в интеле неизвестным мне компилятором имеют тип символов D в выводе nm.
Выглядит это следующим образом.
Моя сборка разными версиями XCode:
% nm -g lib/libtbb.12.dylib | grep __ZTI
0000000000024608 S __ZTIN3tbb6detail2r110user_abortE
0000000000024588 S __ZTIN3tbb6detail2r111unsafe_waitE
00000000000245c8 S __ZTIN3tbb6detail2r114bad_last_allocE
Бинарный пакет с гитхаба от интела:
% nm -g lib/libtbb.12.dylib | grep __ZTI
0000000000067b20 D __ZTIN3tbb6detail2r110user_abortE
0000000000067aa8 D __ZTIN3tbb6detail2r111unsafe_waitE
0000000000067b58 D __ZTIN3tbb6detail2r112missing_waitE
0000000000067ae0 D __ZTIN3tbb6detail2r114bad_last_allocE
Из-за этой разницы после моего PR символ __ZTIN3tbb6detail2r112missing_waitE в моей сборке начинает экспортироваться (как и должен), но в сборке от Intel меняет тип с D на S.
Это решает проблему видимости в библиотеках, собранных в XCode, но похоже ломает ABI в сборке внутри Intel.
И похоже это происходит для всех typeinfo данных в dylib библиотеке onetbb.
Есть у кого-нибудь идеи, что вообще происходит?
Мои идеи закончились 🙁
Идея есть но на тебе не понравится... как известно type-info компайлер специфик и не переносимо
Две сборки с++ от разных компиляторов никогда не были совместимыми. Даже две сборки с++ от одного компилятора, но с разными опциями могут быть несовместимы.
Даже две сборки одного компилятора с одними флагами, но разных версий могут быть не совместимы, чего уж там
но ABI стандартной библиотеки "ломать" всё равно не будем
помнится я какую-то либу собирал, указал ей как обычно через окружение gcc брать т.к. проект gcc'ой собирается сборочный срипт либы такой "ага … ага … о! в системе есть шланг!! так! собираемся шлангом!!!11"
может S это static, D это dynamic?
Это похоже укладка в разные сегменты: Сборка XCode - (__DATA_CONST,__const), у интела получается (__DATA,__data). Это в выводе nm с ключем -m "Display the N_SECT type symbols (Mach-O symbols) as (segment_name, section_name) followed by either external or non-external and then the symbol name."
> gcc --version Apple clang version 14.0.3 (clang-1403.0.22.14.1) Target: arm64-apple-darwin22.6.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
шикарно, но у меня дело на линухе было с нормальным гцц и шлангом
Обсуждают сегодня