glibc.so.6 中的「6」是什麼意思?

glibc.so.6 中的「6」是什麼意思?

在探索 C++ 二進位時,我發現libstdc++.so.6dyn 連結到libm.so.6libc.so.6

$ ldd /lib/x86_64-linux-gnu/libstdc++.so.6 
        linux-vdso.so.1 (0x00007ffcb737b000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd3b2295000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fd3b1c00000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd3b2396000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd3b2275000)

我的問題是:

  1. 6名字裡的意思是什麼?本來以為是glibc的版本,結果版本是2.35,與6.

    $ strings /lib/x86_64-linux-gnu/libc.so.6  | grep GLIBC_2.3
    GLIBC_2.3
    ...
    GLIBC_2.35
    
  2. 為什麼這個字尾6如此受歡迎?

  3. libc.so.7有什麼時候發布的時間表嗎?

答案1

使用 6 後綴是出於歷史原因,詳細資訊請參見man libc在 Linux 上。本質上,Linux 上使用了 GNU C 庫的一個分支;此次發布了主要版本 2 到 5 libc.so.5。當 GNU C 函式庫的版本 2 在 Linux 上發佈時,它使用共用函式庫 sonamelibc.so.6以避免與早期函式庫混淆。

相關庫使用相同的後綴。有些架構使用稍微不同的字尾;例如,Alpha 和 Itanium 上的 GNU C 庫是libc.so.6.1.

GNU C 函式庫具有強大的向後相容性歷史,並使用許多不同的機制來支援引入重大更改,而不會破壞舊的二進位檔案(包括版本化符號)。只有在絕對需要無法緩解的重大變更時才會使用新的 soname ( libc.so.7),因此我們不太可能很快看到這樣的變更。

答案2

這是 ABI(應用程式二進位接口) 版本。

它僅在進行重大更改時才會增加,現在強烈避免這樣做libc,因此大多數發行版已經運行了libc.so.6一段時間。

一般來說,它允許系統上同時存在一個庫的多個不相容版本,支援為不同版本建構的不同應用程式。

例如,Ubuntu 18.04 提供了libcurl.so.3(透過 package libcurl3)和libcurl.so.4(透過 package libcurl4),兩者都是從 cURL 版本 7.58.0 建構的。

相關內容