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