2021年6月28日 星期一

【Linux】查看執行檔需要的library

列出程式中未定義需要外部提供的 symbol

nm -Du 列出程式中未定義需要外部提供的 symbol,就是除了你自己寫的變數、函式等以外,從include來的那些lib裡定義的。


列出需要的 shared library

ldd /bin/ls

或 

objdump -p /bin/ls


執行中的 process,查看 /proc/PID/maps 得知目前用到的 shared library

man proc 可得知 /proc/PID/maps 更多資訊,像是如何得知 PID 目前自己使用到的 memory 數量 (private memory)。

若 shared library 名稱內有 “/”,表示它是路徑,直接用這個路徑找。

若 executable 內有定義 DT_RPATH 沒定義 DT_RUNPATH,從 DT_RPATH 列的目錄裡找。

從 LD_LIBRARY_PATH 列的目錄裡找。

從 DT_RUNPATH 列的目錄裡找。

從 ldconfig 產生的 cache 內找 (/etc/ld.so.cache)。

從 OS 的預設位置找: 先找 /lib 再找 /usr/lib。

用 LD_DEBUG=libs 可以看找的過程

$ LD_DEBUG=libs out/Debug/chrome


當執行ldd -d <file>時,有時會發像某些lib not found。這是因為shared library 直到運行時才會被解析。 為了讓 ldd 指令能找到它們,要將 library 的路徑添加到 LD_LIBRARY_PATH 環境變數,然後 ldd 就能夠找到該library。

沒有留言:

張貼留言