2010-08-03 242 views
0

我收到一些错误,这让我认为我的Linux程序没有链接到它应该使用的库。我如何获得所有链接库的完整路径?我知道ldd会给我的名字,但我怎么能用它来获得完整的路径?跟踪链接库

谢谢。

回答

6

实际上ldd为您提供了绝对路径和文件名,无论您的应用程序的共享库相关性如何,它都能找到。

$ ldd v8test 
    linux-gate.so.1 => (0xb78b2000) 
    libz.so.1 => /usr/lib/libz.so.1 (0xb787e000) 
    librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7875000) 
    libcppunit-1.12.so.1 => /usr/lib/libcppunit-1.12.so.1 (0xb782c000) 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7604000) 
    libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb75dd000) 
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb75bf000) 
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7478000) 
    libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb745f000) 
    libboost_system-mt.so.1.38.0 => /usr/lib/libboost_system-mt.so.1.38.0 (0xb745b000) 
    /lib/ld-linux.so.2 (0xb78b3000) 
    libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7456000) 
    libboost_thread-mt.so.1.38.0 => /usr/lib/libboost_thread-mt.so.1.38.0 (0xb7383000) 
    libboost_filesystem-mt.so.1.38.0 => /usr/lib/libboost_filesystem-mt.so.1.38.0 (0xb7370000) 
    libtinyxml.so.1 => /home/dmitry/tinyxml/libtinyxml.so.1 (0xb7359000) 
    libboost_regex-mt.so.1.38.0 => /usr/lib/libboost_regex-mt.so.1.38.0 (0xb728c000) 
    libmysqlclient_r.so.15 => /usr/lib/libmysqlclient_r.so.15 (0xb70a1000) 
    libicuuc.so.42 => /usr/lib/libicuuc.so.42 (0xb6f61000) 
    libicudata.so.42 => /usr/lib/libicudata.so.42 (0xb601a000) 
    libicui18n.so.42 => /usr/lib/libicui18n.so.42 (0xb5e6b000) 
    libcrypt.so.1 => /lib/i686/cmov/libcrypt.so.1 (0xb5e39000) 
    libnsl.so.1 => /lib/i686/cmov/libnsl.so.1 (0xb5e22000) 

该库由它的soname(例如libboost_filesystem-mt.so.1.38.0)在/etc/ld.so.confLD_LIBRARY_PATH提及或与二元本身rpath设定路径搜索。

如果ldd无法找到它看起来像

libicuuc.so.42 => not found 

在这种情况下考虑使用所提到的方式之一给予正确的搜索路径。

ldd由于某种原因无法加载库时会发出警告。

$ ldd v8test 
./v8test: error while loading shared libraries: /home/dmitry/a/liba.so.2: invalid ELF header 

当然,它不能保护你免受图书馆本身的错误。事实上,您的应用程序可能依赖于库A和B,两者都取决于库C上的不兼容版本。在这种情况下,您的程序很有可能崩溃(除非库C没有symbol versioning) - ldd不会警告你,但你应该能够在输出中看到它。

Program-Library-HOWTO对您有用。

查看ldddynamic linker的一些选项。

+0

如果我知道在0x2F48D76B附近的某些代码已损坏,那么ldd输出是否排除了它是一个破碎的库的可能性? – user108088 2010-08-03 19:45:55

+0

看到我最后的编辑,我希望它会回答你的问题 – 2010-08-04 07:51:56