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