2010-08-03 204 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