Linux

動態連結器/載入器本身如何按照“文件”的報告進行動態連結?

  • September 23, 2019

考慮 的共享對象依賴關係/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

我想知道:

  1. 動態連結器/載入器 ( /lib64/ld-linux-x86-64.so.2) 本身如何動態連結?它是否在執行時連結自身?
  2. /lib/x86_64-linux-gnu/ld-2.28.so記錄處理 a.out 二進製文件(man ld.so),但是/bin/bashELF 執行檔嗎?

程序 ld.so 處理 a.out 二進製文件,這是一種很久以前使用的格式;ld-linux.so*(/lib/ld-linux.so.1 用於 libc5,/lib/ld-linux.so.2 用於 glibc2)處理 ELF,每個人都已經使用多年了。

  1. 是的,它在初始化時會自行連結。從技術上講,動態連結器本身不需要對象解析和重定位,因為它完全按原樣解析,但它確實定義了符號,並且在解析它“解釋”的二進製文件時必須處理這些符號,並且這些符號被更新指向它們在載入的庫中的實現。特別是,這會影響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支持。

fileldd為動態連結器報告不同的內容,因為它們對構成靜態連結二進製文件的定義不同。對於ldd,如果二進製文件沒有DT_NEEDED符號,沒有未定義的符號,則它是靜態連結的。對於file,如果 ELF 二進製文件沒有PT_DYNAMIC節,則它是靜態連結的(這將在file5.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

(與file5.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)。

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