動態連結器可以互換嗎?

動態連結器可以互換嗎?

動態連結器可以互換嗎?

假設我編譯一個程序,例如使用 gcc,連結到各種動態庫,該程式在運行時與 gnu 連結器一起使用來解析動態庫符號。我沒有使用 gnu 連結器,而是需要或想要使用另一個連結器。

那行得通嗎?為什麼/為什麼不呢?

答案1

我假設“動態連結器”指的是動態連結器/載入器,通常稱為ld.so,而不是在建置程式時使用的連結器ld

動態連結器/載入器與其關聯的 C 庫緊密耦合,甚至是其一部分。在 Linux 上,正如這裡通常討論的,通常的載入器是 GNU C 庫的載入器;如果你查看它的符號,你會發現它從 C 庫中提取符號:

$ nm -D /lib/ld-linux.so.2 | grep -E ' A|D '
00028898 D _dl_argv
00000000 A GLIBC_2.0
00000000 A GLIBC_2.1
00000000 A GLIBC_2.3
00000000 A GLIBC_2.4
00000000 A GLIBC_PRIVATE
00028f28 D __libc_enable_secure
00028f24 D __libc_stack_end
00029040 D _rtld_global
000288a0 D _rtld_global_ro

動態連結器/載入器本身如何按照「檔案」報告進行動態連結?了解其工作原理的詳細資訊。

替代 C 庫提供自己的動態載入器;例如,用建構的程序穆斯勒在 x86_64 上將其「解釋器」指定為/lib/ld-musl-x86_64.so.1,這是 musl C 庫本身的連結:

$ ls -l /lib/ld-musl-x86_64.so.1
lrwxrwxrwx 1 root root 25 Jan 23  2019 /lib/ld-musl-x86_64.so.1 -> x86_64-linux-musl/libc.so

載入器依賴其關聯的 C 庫提供的功能,反之亦然。它從技術上講,可以用相容的實作替換給定的載入器,但您至少會有效地重寫現有的載入器。雖然動態載入器的基本規範是明確定義且有界的——載入ELF 二進位(在Linux 上)、關聯的動態庫,並執行必要的重定位等——因此人們可能會想像用另一個載入器替換任何給定的載入器,但實作細節都很重要。

請注意,只要每個動態載入器具有不同的規範名稱,單一系統就可能具有不同的載入器,並由程式酌情使用。這就是為什麼基於 GNU C 庫的系統也可以用於構建和運行 musl 二進位文件,並為諸如llvm-libclibc.so.5,甚至歷史上,從到 的切換libc.so.6

答案2

它們必須是可以互換的。

ld關於eg vs 的一個很好的討論gold可以在這裡找到:https://stackoverflow.com/questions/3476093/replacing-ld-with-gold-any-experience

還要檢查一下:https://stackoverflow.com/questions/29361801/is-the-lld-linker-a-drop-in-replacement-for-ld-and-gold

還有來自 LLVM 專案的 LLD,它有望成為最快的他們所有人中。

相關內容