У меня есть приложение, которое статически связывается с версией X библиотеки libfoo от поставщика третьей стороны, VENDOR1. Он также связывается с динамической (общей) библиотекой libbar от другого поставщика третьей стороны VENDOR2, который статически связывает версию Y libfoo с VENDOR1.Ссылка на несколько версий библиотеки
Так что libbar.so содержит версию Y из libfoo.a, а мой исполняемый файл содержит версию X libfoo.a libbar использует только libfoo, и нет объектов libfoo, переданных из моего приложения в libbar.
Ошибок во время сборки нет, но во время выполнения приложения seg faults. Причина, по-видимому, заключается в том, что в версии X используются структуры, размер которых отличается от Y, а компоновщик времени исполнения, похоже, смешивается, и к ним привыкнуть.
И VENDOR1 & VENDOR2 закрыты, поэтому я не могу их перестроить.
Есть ли способ создать/связать мое приложение таким образом, чтобы он всегда разрешал версию X и libbar всегда разрешал версию Y, а два никогда не смешивались?
Можете ли вы настроить динамическое подключение своего приложения к VENDOR1? –
Никоим образом не является нейтральным языком. Это очень специфично для компоновщика компилятора и ОС, как все они работают вместе. Самый простой способ - отправить по электронной почте обоих вендеров и посмотреть, как они решают эту проблему. –
Наше настоящее мышление, по крайней мере, по Linux, для использования dlopen() на libbar.so с флагом RTLD_DEEPBIND. Другая возможность состоит в том, чтобы отделить использование libfoo.a от приложений в общей библиотеке libbaz.so, которая обертывает использование libfoo.a, а затем приложение dlopen libbaz.so и libbar.so с RTLD_LOCAL, которое, как мы думаем, может содержать все дубликаты символов. Это может работать для Linux, но нам это нужно, поэтому работайте над Solaris, AIX и HPUX. – YerBlues