Я пытаюсь узнать больше о версиях библиотек в 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-страницы.