How can I find the full file path given a library name like libfoo.so.1?
Solution 1
Use ldconfig which is the tool that manages link space.
The -p
flag lets you browse all available linkable libraries.
Solution 2
Expanding on Honky Tonk's answer, the command echo "$(ldconfig -p | grep libGL.so.1 | tr ' ' '\n' | grep /)"
will give you the path alone.
Solution 3
If you don't mind actually loading the library and using some nonstandard but widely-available functions, calling dladdr
on any symbol from the library will return information containing the full pathname that was loaded.
Solution 4
For systems with GNU libc
and Python the following is the closest I found. It uses LD_DEBUG
(described in the man page of ld.so(8)
).
LD_DEBUG=libs python3 -c "import ctypes; ctypes.CDLL('libssl.so.1.0.0')" 2>&1 | \
grep -A 1000 "initialize program: python" | grep -A 3 "find library"
The output (for libssl.so.1.0.0
) is the following:
15370: find library=libssl.so.1.0.0 [0]; searching
15370: search cache=/etc/ld.so.cache
15370: trying file=/lib/x86_64-linux-gnu/libssl.so.1.0.0
15370:
15370: find library=libcrypto.so.1.0.0 [0]; searching
15370: search cache=/etc/ld.so.cache
15370: trying file=/lib/x86_64-linux-gnu/libcrypto.so.1.0.0
15370:
Lekensteyn
Arch Linux user, open-source enthusiast, programmer, Wireshark developer, TRU/e Security master student at TU/e. Interests: network protocols, Linux kernel, server administration, Android, breaking & fixing stuff.
Updated on March 06, 2021Comments
-
Lekensteyn about 3 years
Without implementing a linker or using
ldd
, how can I find the full path to a library? Is there a standard library available for that on Linux? (POSIX maybe?)Using
ldd
andgrep
on a file that is knowingly usinglibGL.so.1
, it looks like:$ ldd /usr/bin/glxinfo | grep libGL libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f34ff796000)
Given a library name like
libGL.so.1
, how can I find the full path/usr/lib/libGL.so.1
?. Preferably accepting an option for finding 32-bit and 64-bit libraries. If no library does that, does a program exist to do this? Something likefind-library-path libGL.so.1
. Thelocate libGL.so.1
command does not count.I don't want to actually load the library using
dlopen
or something if it executes code from that library.