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