Dynamic-Linking
“靜態連結”是什麼意思?
據我了解,
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()
對動態庫進行呼叫並為呼叫動態庫創建正確的偏移量。由於這個執行時連結器正在做這項工作,它不能依賴於其他動態對象。