I have an executable on Linux that loads libfoo.so.1
(that's a SONAME
) as one of its dependencies (via another shared library). It also links to another system library, which, in turn, links to a system version, libfoo.so.2
. As a result, both libfoo.so.1
and libfoo.so.2
are loaded during execution, and code that was supposed to call functions from library with version 1 ends up calling (binary-incompatible) functions from a newer system library with version 2, because some symbols stay the same. The result is usually stack smashing and a subsequent segfault.
Now, the library which links against the older version is a closed-source third-party library, and I can't control what version of libfoo
it compiles against. Assuming that, the only other option left is rebuilding a bunch of system libraries that currently link with libfoo.so.2
to link with libfoo.so.1
.
Is there any way to avoid replacing system libraries wiith local copies that link to older libfoo
? Can I load both libraries and have the code calling correct version of symbols? So I need some special symbol-level versioning?