Dynamic-Linking

“靜態連結”是什麼意思?

  • July 11, 2018

據我了解,so文件是動態庫。我們可以使用ldd它來列印它的依賴關係。

例如,我可以執行ldd -r /usr/lib/aarch64-linux-gnu/libstdc++.so.6得到如下輸出:

   linux-vdso.so.1 =>  (0x0000ffff793f7000)
   libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffff79173000)
   libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffff7902c000)
   /lib/ld-linux-aarch64.so.1 (0x0000aaaae0a5d000)
   libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffff7900b000)

但是,今天當我執行時ldd -r /lib/ld-linux-aarch64.so.1,我得到了這個:

statically linked

為什麼我會得到這樣的輸出?這是什麼意思?

該文件不使用動態庫,而是在執行檔中包含所需的庫部分。

結果,ldd無法告訴您有關該文件的任何資訊。

這意味著執行檔不需要動態庫,但這也意味著它無法從庫中的錯誤修復中受益,並且如果更改核心介面,靜態執行檔將無法使用更改後的新核心。

run time linker在您的特殊情況下,您正在檢查用於在執行時將動態庫連結到主二進製文件的所謂的,方法是通過mmap()對動態庫進行呼叫並為呼叫動態庫創建正確的偏移量。由於這個執行時連結器正在做這項工作,它不能依賴於其他動態對象。

引用自:https://unix.stackexchange.com/questions/454674