
在探索 C++ 二進位時,我發現libstdc++.so.6
dyn 連結到libm.so.6
和libc.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)
我的問題是:
6
名字裡的意思是什麼?本來以為是glibc的版本,結果版本是2.35
,與6
.$ strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_2.3 GLIBC_2.3 ... GLIBC_2.35
為什麼這個字尾
6
如此受歡迎?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 建構的。