C

我的系統使用什麼 C 庫版本?

  • April 1, 2015

如何確定我的系統使用的是什麼使用者態 C 庫?需要此資訊的可能原因包括:

  • 我正在考慮下載一個巨大的源程序包,我確信它會進行適當的檢查並列出一個最小庫版本,但我寧願先檢查它是否可以工作,以免給自己帶來麻煩。
  • 我擔心ABI與我想嘗試在系統的包管理系統之外安裝的一些第三方二進製文件的兼容性。
  • 我有一個源包,其文件中提到需要我的系統庫的最低版本,但建構過程不執行任何檢查。
  • 我正在建構一個針對特定係統的交叉編譯器,並且不想冒前向兼容性問題的風險。

GNU/Linux 系統通常使用 glibc(Fedora/Redhat 家族,Arch)或其近親 eglibc(Debian/Ubuntu 家族);由於 eglibc 現在被合併回 glibc(請參閱在“新聞”下創建的 EGLIBC 2.19 分支),在不久的將來它們都將再次成為 glibc。

檢查確切版本的最簡單方法是詢問ldd,它隨 C 庫一起提供。

在 Fedora 20 上:

> ldd --version
ldd (GNU libc) 2.18

那是 glibc 2.18。

在 Raspbian(ARMv6 Broadcom SoC 的 Debian 7 埠)上:

> ldd --version
ldd (Debian EGLIBC 2.13-38+rpi2) 2.13

那是eglibc 2.13。

如果您出於某種原因混合併匹配了某些部分或不確定ldd,您可以直接查詢 C 庫。

> whereis libc.so
libc: /usr/lib64/libc.a /usr/lib64/libc.so /usr/share/man/man7/libc.7.gz

這些都不是可執行的,但它們提供了在哪裡可以找到的線索。

> $(find /usr/lib64/ -executable -name "*libc.so*") --version
GNU C Library (GNU libc) stable release version 2.18, by Roland McGrath et al.

然而,這並不一定那麼容易,因為 C 庫不必駐留在某個whereis可以找到它的地方。

> whereis libc.so
libc: /usr/share/man/man7/libc.7.gz

不幸的是,手冊頁沒有提供版本號。 ldd仍然派上用場,因為系統上任何工作的、動態連結的執行檔(例如 中的幾乎所有內容/usr/bin)都將連結到 C 庫。

> ldd /usr/bin/touch
   /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6eed000)
   librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xb6ed0000)
   libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6da1000)
   /lib/ld-linux-armhf.so.3 (0xb6efb000)
   libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6d82000)

libc.so.6在第三行。

> /lib/arm-linux-gnueabihf/libc.so.6 --version
GNU C Library (Debian EGLIBC 2.13-38+rpi2) stable release version 2.13, by Roland McGrath et al.

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