Reputation: 86
I am currently working on a userland ELF File loader in C. LD_LIBRARY_PATH
does not seem to be an option for me, as it does not seem to be set by default on my system(x86_64 openSUSE). What is the best way to get all of the directories where libraries are stored ?
Upvotes: 0
Views: 662
Reputation: 12708
LD_LIBRARY_PATH
is the standard environment variable used for users to add and load their own libraries when they are unable or have no access to the system directories to install shared libraries.
There's a file which is normally read by ldconfig
at boot time (it reads /etc/ld.so.conf
to create a binary DBMsomewhat file /etc/ld.so.cache
, with a hash table to quick access the paths to use when loading library shared objects, and that is used by the dynamic loader (there's only one such thing, as a kernel tool, so it is not dependant on which distribution you run, but just on the kernel version you use ---it has changed somewhat, but not as much as the kernel does---)
To know which sonames (soname is the common name used by a shared object to refer to an interface, which is what is required to warranty that a shared object will be compatible with the library) are being used by the dynamic loader, just run
ldconfig -p
and you'll get all the sonames registered, and the path to the library actually loaded for that soname.
If you want to know which libraries will be loaded by some specific executable by the dynamic loader, just execute this:
ldd your_executable
and It will print the sonames that executable needs and where in the system they are located.
What ldconfig(8)
does, is to search al the directories included in the file /etc/ld.so.conf
for shared object files, and look all the ones whose name matches the soname stored in the file, and include a reference to the file named for the soname found. Once the table is completed, the file /etc/ld.so.cache
is created and used by /lib64/ld-linux-x86-64.so.2
which is the shared module in charge of user mode loading the rest of shared libraries used by a program.
There's no problem in having a local $HOME/lib
directory to store your locally developed shared libraries, but as that directory will not be normally included in /etc/ld.so.conf
, you'll need to create LD_LIBRARY_PATH=${HOME}/lib
and be careful to export it, and never try to use it as root user, as for root user that env variable is disabled.
By the way, if you need to load on demand a shared library (this is possibly what you need, probably), read about dlopen(3)
and friend functions, as that is the method used by most programs to dynamically load modules you haven't heard about before compilation of main program. You'll need to load the module, look for the symbols you need (dlsym(3)
or dlfunc(3)
) store the references given by the module, and finally call them.
Upvotes: 1
Reputation: 11514
/usr/lib64
and /lib64
for 64-bit binaries or /usr/lib
and /lib
for 32-bit binaries, than paths taken from /etc/ld.so.conf
and included configs
From man ldconfig
ldconfig
creates the necessary links and cache to the most recent shared libraries found in the directories specified on the command line, in the file/etc/ld.so.conf
, and in the trusted directories,/lib
and/usr/lib
(on some 64-bit architectures such as x86-64,/lib
and/usr/lib
are the trusted directories for 32-bit libraries, while/lib64
and/usr/lib64
are used for 64-bit libraries).The cache is used by the run-time linker, ld.so or ld-linux.so.
...
/etc/ld.so.conf File containing a list of directories, one per line, in which to search for libraries.
Note that this info is for openSUSE, other distros may use different paths.
Upvotes: 1