Tool for Library Dependency
It depends on what exactly is meant by "detect library dependencies".
The ldd
command works on shared libraries, not just on executables. It will display the dependencies of a shared library declared when the library was built:
$ ldd /usr/lib/libgtk-3.so linux-vdso.so.1 (0x00007ffff8fff000) libgdk-3.so.0 => /usr/lib/libgdk-3.so.0 (0x00007f43fcf47000) libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x00007f43fcd43000) libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0x00007f43fcb36000) libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f43fc7fc000)...
A library can have undefined symbols that are obtained by linking with further libraries not declared as dependencies. You can use objdump -T
or nm -D
to show the dynamic symbols - undefined symbols (those that should come from other libraries) will show up as *UND*
:
$ objdump -T /usr/lib/libgtk-3.so | head/usr/lib/libgtk-3.so: file format elf64-x86-64DYNAMIC SYMBOL TABLE:0000000000066e38 l d .init 0000000000000000 .init0000000000000000 DF *UND* 0000000000000000 g_param_spec_object0000000000000000 DF *UND* 0000000000000000 g_utf8_validate0000000000000000 DF *UND* 0000000000000000 g_date_get_month0000000000000000 DF *UND* 0000000000000000 g_bookmark_file_get_visited0000000000000000 DF *UND* 0000000000000000 g_value_get_float
From these symbol names it should be possible to deduce undeclared library dependencies.
Libraries that use pkg-config
or similar configuration mechanism sometimes fail to declare their dependencies at build-time, but declare the dependencies to pkg-config
, relying on the library users to use the tool to get the dependencies. pkg-config --libs
will list the dependencies in the format understood by the compiler:
$ pkg-config --libs gtk+-3.0-lgtk-3 -lgdk-3 -latk-1.0 -lgio-2.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo-gobject -lpango-1.0 -lcairo -lgobject-2.0 -lglib-2.0