Возникло недавно желание разобраться с проблемой Dependency hell’а на онтопике, с этой проблемой на оффтопике кое-как разобрались с помошью SxS.
Речь вот о чём: У нас есть приложение main.exe которое линкуется с двумя плагинами (в линктайме или через dlopen, не важно): plugin1.so, plugin2.so.
Но каждый из этих плагинов использует библиотеку lib, причём разных мажорных версий, т.е lib1.so и lib2.so. С тем же успехом это могут быть совсем разные библиотеки но с одинаковым символом.
Я тут поигрался с примерами и оказывается что в линуксе райнтайм линкер тупо заставляет весь процесс иметь одну реализацию для одного символа, без учёта того откуда этот символ требуется.
Это конечно имеет смысл в определённых случаях, например с malloc/free, но после Windows это забавно выглядит. На винде нам достаточно или использовать SxS (Что мне не нравится, но это хотяб решение), или использовать lib с разными именами (опять же lib1.dll и lib2.dll). Система автоматически свяжет в рантайме все запрошенные символы из plugin2 с символами из lib2, и все символы из plugin1 с символами из lib1. Plugin1/Plugin2 не будут ничего знать о символах из соседнего плагина.
Я так понимаю что в линуксе это можно решить только если иметь доступ к исходникам lib и собрать обе версии с версионированным символами? Может ли использование lib через dlopen помочь? Просто спрашиваю чтоб убедиться что я ничего не упустил. Кажется -BDirect помогает бороться с этим но в Solaris.
Собственно интерес у меня в этом всём от того что я работаю в компании которая разрабатывает lib.dll/so. Пока основные заказчики на windows, но хочется разобраться с этой тонкостью на линуксе.
Ссылки по теме: https://habr.com/ru/post/220961 http://cryptonector.com/2012/02/dll-hell-on-linux-but-not-solaris/
Если интересно глянуть на конкретные исходники - накидал вот: https://github.com/olologin/dependency_hell_runtime