问题
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?
回答1:
You may be able to do some version script tricks:
http://sunsite.ualberta.ca/Documentation/Gnu/binutils-2.9.1/html_node/ld_26.html
This may require that you write a wrapper around your lib that pulls in libfoo.so.1 that exports some symbols explicitly and masks all others as local. For example:
MYSYMS { global: foo1; foo2; local: *; };
and use this when you link that wrapper like:
gcc -shared -Wl,--version-script,mysyms.map -o mylib wrapper.o -lfoo -L/path/to/foo.so.1
This should make libfoo.so.1's symbols local to the wrapper and not available to the main exe.
回答2:
I can only come up with a work-around. Which would be to statically link a version of the "system library" that you are using. For your static build, you could make it link against the same old version as the third-party library. Given that it does not rely on the newer version...
Perhaps it is also possible to avoid these problems with not linking to the third-party library the ordinary way. Instead, your program could load it at execution time. Perhaps then it could be shadowed against the rest. But I don't know much about that.
来源:https://stackoverflow.com/questions/228117/loading-multiple-shared-libraries-with-different-versions