Загрузка нескольких общих библиотек с разными версиями
У меня есть исполняемый файл в Linux, который загружаетlibfoo.so.1
(этоSONAME
) как одна из его зависимостей (через другую разделяемую библиотеку). Он также ссылается на другую системную библиотеку, которая, в свою очередь, ссылается насистема версия,libfoo.so.2
, В следствии,и то и другое libfoo.so.1
а такжеlibfoo.so.2
загружаются во время выполнения, и код, который должен был вызывать функции из библиотеки с версией 1, в конечном итоге вызывает (двоично-несовместимые) функции из более новой системной библиотеки с версией 2, потому что некоторые символы остаются прежними. Результатом обычно является разрушение стека и последующий сегмент.
Теперь библиотека, которая ссылается на более старую версию, является сторонней библиотекой с закрытым исходным кодом, и я не могу контролировать, какая версияlibfoo
это компилируется против. Предполагая, что единственный оставшийся вариант - это перестройка группы системных библиотек, которые в настоящее время связаны сlibfoo.so.2
связать сlibfoo.so.1
.
Есть ли способ избежать замены системных библиотек локальными копиями, которые ссылаются на старыеlibfoo
? Могу ли я загрузить обе библиотеки и получить код, вызывающий правильную версию символов? Так что мне нужно специальное управление версиями на уровне символов?