動態連結器/載入器本身如何按照“文件”的報告進行動態連結?
考慮 的共享對象依賴關係
/bin/bash
,其中包括/lib64/ld-linux-x86-64.so.2
(動態連結器/載入器):ldd /bin/bash linux-vdso.so.1 (0x00007fffd0887000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000) /lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
檢查
/lib64/ld-linux-x86-64.so.2
表明它是一個符號連結/lib/x86_64-linux-gnu/ld-2.28.so
:ls -la /lib64/ld-linux-x86-64.so.2 lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
此外,
file
報告/lib/x86_64-linux-gnu/ld-2.28.so
自身是動態連結的:file -L /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
我想知道:
- 動態連結器/載入器 (
/lib64/ld-linux-x86-64.so.2
) 本身如何動態連結?它是否在執行時連結自身?/lib/x86_64-linux-gnu/ld-2.28.so
記錄處理 a.out 二進製文件(man ld.so
),但是/bin/bash
ELF 執行檔嗎?程序 ld.so 處理 a.out 二進製文件,這是一種很久以前使用的格式;ld-linux.so*(/lib/ld-linux.so.1 用於 libc5,/lib/ld-linux.so.2 用於 glibc2)處理 ELF,每個人都已經使用多年了。
- 是的,它在初始化時會自行連結。從技術上講,動態連結器本身不需要對象解析和重定位,因為它完全按原樣解析,但它確實定義了符號,並且在解析它“解釋”的二進製文件時必須處理這些符號,並且這些符號被更新指向它們在載入的庫中的實現。特別是,這會影響
malloc
- 連結器有一個內置的最小版本,帶有相應的符號,但是一旦載入和重定位它就會被 C 庫的版本替換(如果有的話,甚至被插入的版本替換),需要小心採取以確保這不會發生在可能會破壞連結器的地方。血淋淋的細節在
rtld.c
函式中dl_main
。但是請注意,
ld.so
它沒有外部依賴項。您可以看到與nm -D
;相關的符號。它們都不是未定義的。 2. 手冊頁僅引用直接在 下的條目/lib
,即/lib/ld.so
(支持 的 libc 5 動態連結器a.out
)和/lib*/ld-linux*.so*
(支持 ELF 的 libc 6 動態連結器)。手冊頁非常具體,而ld.so
不是ld-2.28.so
.在絕大多數目前系統上發現的動態連結器不包括
a.out
支持。
file
並ldd
為動態連結器報告不同的內容,因為它們對構成靜態連結二進製文件的定義不同。對於ldd
,如果二進製文件沒有DT_NEEDED
符號,即沒有未定義的符號,則它是靜態連結的。對於file
,如果 ELF 二進製文件沒有PT_DYNAMIC
節,則它是靜態連結的(這將在file
5.37 之後的版本中更改;它現在使用PT_INTERP
節的存在作為動態連結二進製文件的指示符,這與中的註釋相匹配編碼)。GNU C 庫動態連結器沒有任何
DT_NEEDED
符號,但它確實有一個PT_DYNAMIC
部分(因為它在技術上是一個共享庫)。結果,ldd
(即動態連結器)表明它是靜態連結的,但file
表明它是動態連結的。它沒有PT_INTERP
部分,因此下一個版本file
也將表明它是靜態連結的。$ ldd /lib64/ld-linux-x86-64.so.2 statically linked $ file $(readlink /lib64/ld-linux-x86-64.so.2) /lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(與
file
5.35)$ file $(readlink /lib64/ld-linux-x86-64.so.2) /lib/x86_64-linux-gnu/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
(使用目前正在開發的版本
file
)。