Я пытаюсь узнать больше о версиях библиотек в Linux и о том, как заставить все это работать. Вот контекст:
- У меня есть две версии динамической библиотеки, которые предоставляют один и тот же набор интерфейсов, скажем, libsome1.soи libsome2.so.
- Приложение связано с libsome1.so.
- Это приложение использует libdl.soдля динамической загрузки, скажем, другой модуль libmagic.so.
- Сейчас libmagic.soсвязано против libsome2.so. Очевидно, что без использования сценариев компоновщика для скрытия символов во libmagic.soвремя выполнения все вызовы интерфейсов libsome2.soразрешаются libsome1.so. Это может быть подтверждено проверкой значения, возвращаемого libVersion()значением макроса LIB_VERSION.
- Поэтому я пытаюсь затем скомпилировать и связать libmagic.soс помощью сценария компоновщика, который скрывает все символы, кроме 3, которые определены в libmagic.soи экспортируются им. Это работает ... Или, по крайней мере, libVersion()и LIB_VERSIONзначения совпадают (и это сообщает версию 2, а не 1).
- Однако, когда некоторые структуры данных сериализуются на диск, я заметил некоторое повреждение. В каталоге приложения, если я удаляю libsome1.soи создаю на его месте программную ссылку, чтобы все указывало libsome2.so, все работает, как ожидалось, и такое же повреждение не происходит.
Я не могу не думать, что это может быть вызвано некоторым конфликтом в разрешении символов компоновщика во время выполнения. Я пробовал много вещей, например, пытался скомпоновать libsome2.soтак, чтобы все символы были разделены на symbol@@VER_2(что я все еще запутался, потому что команда nm -CD libsome2.soвсе еще перечисляет символы как symbolи нет symbol@@VER_2) ... Ничто, кажется, не работает !!! Помогите!!!!!!
RTLD_LOCALи RTLD_DEEPBINDустановите флаги в вашем приложении. У меня нет времени, чтобы проверить это сейчас, но это должно работать на основе man-страницы.