AshBlade
@AshBlade
Просто хочу быть счастливым

Как обеспечивается совместимость динамических библиотек при ликовке в рантайме?

C++ использует манглинг для имен для поддержки классов, перегрузок, шаблонов.
Но каждый компилятор по своему его (манглинг) реализует (g++, clang, mingw ...)

Вопрос: как программы на C++, собранные компилятором X, понимают какие функции из дин. библиотеки, написанной тоже на C++ и собранной другим компилятором Y, им нужно связать/слинковать во время исполнения?

Есть предположения:
1. Такие библиотеки распространяются через исходный код и каждый сам создает свои дин. библиотеки
2. Библиотека собирается различными компиляторами и каждый скачивает нужную версию
3. Есть специальная конвенция именования конкретно для дин. библиотек
  • Вопрос задан
  • 336 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Устроено просто.
1. Имена всё равно стараются не козявить. Те библиотеки, где объектный интерфейс выставлен наружу, менее любимы. А уж шаблонных специализаций вообще сторонятся.
2. А если козявить — есть модель Windows (MSVC, Borland) и модель Linux (MinGW, CLang).
3. В модели Linux подключение DLL устроено через файл *.a, смысл которого для DLL’ки — сопоставить покозявленное компилятором имя функции и таковое же, выставленное DLL’кой наружу. И для любой DLL’ки можно создать этот *.a с любыми именами. MSVC CL и MinGW LD могут подключать DLL и напрямую, CLang LLD — когда проверял, ещё нет.
4. Да, а как заменить в скомпилированной программе. Обычно новую версию DLL’ки компилируют тем же компилятором — вот и вся совместимость. В x64 с этим делом проще, чем в x86 — меньше соглашений вызова.
5. Часто в ABI приходится переименовывать функции из-за того, что сменилась сигнатура. То есть тащат и старую, и новую с разными именами.

Когда программа собирается одним компилятором, а DLL’ка другим — это всегда большая сложность, и вопроса два: соглашения вызова и правило, по которым козявятся имена.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
То, что экспортируется из дин. библиотеки имеет стандартизированные имена.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега C++
software engineer
Просто по именам функций. Они указаны в спецификациях.
Совместимость между версиями обычно обеспечивается вендором, но между разными версиями операционки, разница в динамических библиотеках может стать проблемой.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы