Linux(Ubuntu/CentOS) 下查看 GLIBC 版本

2023-05-16


title: Linux(Ubuntu/CentOS) 下查看 GLIBC 版本
date: 2020-10-06 23:35
author: gatieme
tags: linux
categories:
- linux
thumbnail:
blogexcerpt: 之前在工作中, 经常有同事问我怎么知道当前系统中 GLIBC 的版本号是多少. 今天安装软件的时候, 想到了这个问题, 于是记录下, 与大家共勉.


日期作者GitHubCSDNBLOG
2020-10-06gatiemeAderXCodingLinux(Ubuntu/CentOS) 下查看 GLIBC 版本Linux(Ubuntu/CentOS) 下查看 GLIBC 版本

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作

知识共享许可协议

因本人技术水平和知识面有限, 内容如有纰漏或者需要修正的地方, 欢迎大家指正, 鄙人在此谢谢啦

转载请务必注明出处, 谢谢, 不胜感激


1 ldd --version


最简单直接的方法

ldd --version

其输出如下:

001-ldd_version.png

2 通过 libc.so 获取版本号


GLIBC 库已经为了我们考虑到这点了, 因此从 libc.so 我们可以获取到版本信息.

2.1 首先查找到 libc 库的位置


关于如何找到 GLIBC 库, 有多种方法

  1. ldd 一个当前系统中 C 库编写的动态可执行程序
ldd `which top` | grep "libc.so"
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6e32226000)

002-01-libc_ldd

  1. 原理同 2, 只不过是从正在运行的程序的动态库中获取

当前进程 shell 一般是一个 C 库的程序, lsof 查看它运行时加载的 libc 库是哪个

lsof -p $$ 2>&1 | grep "libc-"

002-02-libc_lsof

  1. 通过 gcc 获取到 libc 库的位置

cat gcc -print-file-name=libc.so

002-03-libc_gcc.png

2.2 从 libc 库上获取版本号


  1. 直接看 libc.so 的后缀版本号

很明显, libc-2.27.so 后缀为 2.27, 因此 GLIBC 版本号为 2.27

002-11-libc_str

  1. 直接运行 libc.so

GLIBC 的动态库是可以执行运行的, 运行将显示版本号以及版权信息, 可以看到 版本号也是 2.27

002-12-libc_run

  1. 同 2, 获取版本号

GLIBC 库加上 --version 同样显示版本号, 我们可以看到打印的信息和直接运行的信息是一致的.

002-13-libc_version

3 GNU_LIBC_VERSION


标记 GLIBC 版本号的变量为 GNU_LIBC_VERSION, 直接查看它即可

getconf GNU_LIBC_VERSION

003-GNU_LIBC_VERSION

注意我们还有另外一个变量, 也可以类似的获取到 GLIBC PTHREAD 版本号, GNU_LIBPTHREAD_VERSION, 不过多数情况下, 他与 GLIBC 版本号是一致的.

getconf GNU_LIBPTHREAD_VERSION

003-GNU_LIBPTHREAD_VERSION

在 Linux 上实现 pThreads 的 NPTL 项目是一个单独的项目, 最初添加内核支持并提供自己的库. 当它足够稳定时, 就会合并为glibc.
我们发行版一般使用的 GLIBC 都是 stable 版本, 因此我认为这两个版本在所有合理的最新安装上都是相同的.

4 gnu_get_libc_version


GLIBC 中内置了一些信息标记版本号, 用来在程序中可以获取到 GLIBC 的版本号. 这是一个字符串, 因为一些高级的特性是 GLIBC 高版本才支持的, 因此用户的程序可能经常要看版本号来执行不同的操作和处理.
gnu_get_libc_version 和 gnu_get_libc_release 就是这样的内置信息, 我们可以通过 man 手册来获取详细信息.

// cat get_glibc_version.c
#include <gnu/libc-version.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
        printf("GNU libc version: %s\n", gnu_get_libc_version());
        printf("GNU libc release: %s\n", gnu_get_libc_release());

        return EXIT_SUCCESS;
}

004-gnu_get_libc_version

5 查看发行版安装的软件包版本


发行版打包的软件包一般都是有版本号后缀的, 因此查看我们发行版安装的 GLIBC 包的名字, 就可以知道版本号.

比如 Ubuntu 可以使用 dpkg -l 查看安装的软件版本
005-ubuntu_dpkg
同样 Centos 也可以使用 rpm -q glibc 查看对应软件包的名称及版本.

6 参考资料


Linux: Check the glibc version


  • 本作品/博文 ( AderStep-紫夜阑珊-青伶巷草 Copyright ©2013-2017 ), 由 成坚(gatieme) 创作.

  • 采用知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme ), 不得用于商业目的.

  • 基于本文修改后的作品务必以相同的许可发布. 如有任何疑问,请与我联系.

  • 转载请务必注明出处, 谢谢, 不胜感激

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux(Ubuntu/CentOS) 下查看 GLIBC 版本 的相关文章

  • touch命令在一个目录下创建多个文件(不同名称)

    我想制作一个在 bash 中创建目录和文件结构的脚本 我尝试过这样的事情 mkdir p 1 2 touch 1 2 a b c a b c 应该是在一个命令或其他命令中创建的文件 但由于某种原因 结构是这样的 current folder
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • 构建 makefile 依赖/继承树

    如果我解释得不好或者问了一些明显的问题 我很抱歉 但我是 Linux 内核的新手 而且有点深入 我们有一个嵌入式 Linux 系统 它附带一个 文档非常糟糕的 SDK 其中包含数百个文件夹stuff 大多数文件夹包含rules make m
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 停止服务时单元陷入故障状态(状态=143)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这是我的问题 我有 CentOS 和 java 进程在上面运行 Java进程是通过启动 停止脚本来操作的 它也创建了 java 实例的 p
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 无法在 Google Cloud Run 上部署 Ubuntu 20.04 Docker 容器

    我正在尝试通过 Google Cloud Run 部署一个基于 Ubuntu 20 04 的简单的基于 Python 的 Docker 容器 我已经成功构建了映像 但是当我尝试部署 Cloud Run 服务时 出现以下错误 省略了项目详细信
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐