У меня есть исполняемый файл в 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? Могу ли я загрузить обе библиотеки и иметь код, вызывающий правильную версию символов? Итак, мне нужно какое-то специальное управление версиями на уровне символов?