Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to load a shared library without loading its dependencies?

Say I have a library libfoo.so.1, which depends (according to ldd) on libbar.so.1. However, libbar.so.1 is not available at the moment. My app needs to call a function in libfoo.so.1 which doesn't require libbar.so.1 at all.

Is there a way to load libfoo.so.1, resolve the function symbol and then call it without having libbar.so.1 to satisfy the dependency? It's a case of "I know what I'm doing, just let me do it already". I tried the RTLD_LAZY flag, but it still tries to load the libbar.so.1 library before not loading the symbols.


EDIT

Here's the exact situation.

We have 3 players:

  • libbar.so.1, a shared library located in a path not in LD_LIBRARY_PATH or ldconfig, and whose dependencies are all resolved
  • libfoo.so.1, a shared library located in a different directory than libbar, but which depends on libbar. At runtime, libfoo will know where to locate libbar.
  • App, a binary application which needs to load libfoo at some point during runtime.

App doesn't know where to find libbar, but knows that libfoo knows. What I'm trying to accomplish is having an init function in libfoo which would simply change App's current working directory to where libbar is located to finally resolve all the dependencies and make everyone happy.

libfoo will eventually need to call stuff in libbar, just not in this init function. I don't think creating a stub would work since the symbols would eventually need to resolve to the real functions.

like image 750
Fred Avatar asked Jan 05 '10 21:01

Fred


1 Answers

Well, variables are still resolved even with RTLD_LAZY, so in general you do need all the libraries to be linked. Seems like you should create a stub libbar.so.1 that has no functionality and can be found by the linker.

like image 184
Adam Goode Avatar answered Sep 28 '22 08:09

Adam Goode