检查特定gcc编译器所使用的glibc版本

78

我在系统上安装了两个gcc编译器,一个是gcc 4.1.2(默认),另一个是gcc 4.4.4。 我该如何检查gcc 4.4.4使用的libc版本,因为/lib/libc.so.6显示的是gcc 4.1.2使用的glibc,因为它是默认编译器。


1
如果您想在编译时执行检查,则Zwol在下面的答案可能是最佳方法。如果您想在运行时检查版本,则R1tschY的答案可能是最佳方法。请注意,由于Linux无法自行获取正确路径,因此在运行时可能无法获得您期望的Glibc版本或标准C ++库版本。另请参见将g++ 4.8链接到libstdc++ - jww
9个回答

72

更加简单易懂

使用ldd --version

这应该会返回正在使用的glibc版本,即:

$ ldd --version

ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO

这与运行我的libc库得到的结果相同。

$ /lib/libc.so.6 


GNU C Library (GNU libc) stable release version 2.17, by Roland McGrath et al.
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.

...


4
以上命令的结果不同。在我的电脑上:GNU libc版本为2.17,ld-linux-x86-64.so.2(GLIBC_2.3)=> /lib64/ld-linux-x86-64.so.2 ?? - Adam
1
这显示了ldd链接的内容。在链接程序时,您会链接到某个libc实现(可能不止一个),而不是ldd - Maxim Egorushkin
这并不适用于交叉编译器。 - undefined

53

编写一个测试程序(例如将其命名为 glibc-version.c):

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

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

使用gcc-4.4编译它:

gcc-4.4 glibc-version.c -o glibc-version

执行./glibc-version命令将显示正在使用的glibc版本。


它对我有效,但是在哪里有文档记录呢?我正在查看glibc 2.7文档,但是找不到。 - Ciro Santilli OurBigBook.com
该函数是Gnulib的一部分:https://www.gnu.org/software/gnulib/manual/gnulib.html - R1tschY
7
你可以只写 ldd --version 吗? - Kevdog777
我使用OSX,但出现了以下错误信息 ==> 致命错误:找不到“gnu/libc-version.h”文件 <== 为什么会这样?难道OSX没有标准的C库吗? - Koray Tugay
@KorayTugay:嗯,是的,但OS X/macOS从Xcode 3.1发布开始就开始从GCC转向LLVM/Clang(尽管它确实有一段时间可用的LLVM-GCC实例),因此您必须寻找_Clang_的C标准库。 - RandomDSdevel
4
OSX 从未使用过 GNU C 库;它的 Unix 用户空间全部来自于 BSD。它最初确实使用 GCC 作为系统编译器,但苹果公司对 GPLv3 有抗拒情绪;他们在 GCC 许可证变更后不久开始大力资助 LLVM,这并非偶然。 - zwol

38

使用-print-file-name gcc选项:

$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so

这给出了路径。让我们检查一下文件:

$ file $(gcc -print-file-name=libc.so)
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so: ASCII text

$ cat $(gcc -print-file-name=libc.so)
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

这个文件是一个链接脚本,用于链接GROUP列表中的库。


在ELF平台上,/lib/x86_64-linux-gnu/libc.so.6是一个具有动态符号表(类似于共享库)的位置无关可执行文件:

$ file /lib/x86_64-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6: symbolic link to libc-2.31.so

$ file $(readlink -f /lib/x86_64-linux-gnu/libc.so.6)
/usr/lib/x86_64-linux-gnu/libc-2.31.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1878e6b475720c7c51969e69ab2d276fae6d1dee, for GNU/Linux 3.2.0, stripped

$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.9) stable release version 2.31.
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 9.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

30

gnu_get_libc_version 用于识别 GNU C 库的 运行时 版本。

如果你关心的是 编译时 版本(即提供在 /usr/include 目录下头文件的版本),你需要查看宏 __GLIBC____GLIBC_MINOR__。它们会展开为正整数,并且在包含任何 GNU C 库提供的头文件时会被定义;这意味着你可以先包含一个标准头文件,然后使用 #ifdef __GLIBC__ 来决定是否可以包含非标准头文件,例如 gnu/libc-version.h

将已接受答案中的测试程序进行扩展:

#include <stdio.h>
#ifdef __GLIBC__
#include <gnu/libc-version.h>
#endif

int
main(void)
{
#ifdef __GLIBC__
  printf("GNU libc compile-time version: %u.%u\n", __GLIBC__, __GLIBC_MINOR__);
  printf("GNU libc runtime version:      %s\n", gnu_get_libc_version());
  return 0;
#else
  puts("Not the GNU C Library");
  return 1;
#endif
}
当我在我正在输入这个答案的电脑上编译并运行这个程序(它是一台Mac),它会打印出:
Not the GNU C Library

但是当在附近的Linux箱上编译并运行时,它打印出

GNU libc compile-time version: 2.24
GNU libc runtime version:      2.24

通常情况下,“运行时”版本可能比“编译时”版本更大,但永远不会更小。主要版本号不太可能再次更改(上次更改是1997年的“libc6转换”)。

如果您想使用shell“一行命令”来转储这些宏,请使用:

echo '#include <errno.h>' | gcc -xc - -E -dM | 
    grep -E '^#define __GLIBC(|_MINOR)__ ' | sort

选择 grep 模式以仅匹配相关的两个宏,因为有许多内部宏命名为 __GLIBC_somethingorother,你不想阅读这些内容。


从相关问题的评论中得知:echo '#include <errno.h>' | gcc -x c -dM -E - | egrep -i '(gnu|lib)' - jww
Uclibc-ng支持gnu_get_libc_version(),因此“Not the GNU C Library”不太准确。 - pevik
@pevik 它定义了 __GLIBC__ 吗?(不应该这样。) - zwol
@pevik 我会说这是uclibc中的一个bug,除非它已经支持了每一个glibc扩展,但这似乎不太可能。 - zwol
在我看来,它并不是。他们在features.h中定义了__GLIBC__ 2__GLIBC_MINOR__ 2,这可能是他们完全支持的内容。glibc 2.2于2000年11月9日发布(18年前),如果你比较两个项目的头文件,它们看起来很相似。 - pevik
显示剩余4条评论

10

我怀疑你的系统中是否安装了多个glibc。但是,ldd -v <path/to/gcc-4.x> 命令可以告诉你所使用的glibc版本。


1
-v在我的情况下是一个绝妙的建议,帮助我清楚地看到缺少了哪些库版本。 - Artem Russakovskii

7

最简单的方法是使用随附于glibcldd

只需运行以下命令:ldd --version

dina@dina-X450LA:~$ ldd --version
ldd (Ubuntu GLIBC 2.23-0ubuntu9) 2.23
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

有两种额外的方法可以查找glibc版本:

  1. 检查已安装的glibc rpm包的版本:通过运行以下命令来完成

    rpm -q glibc

  2. 检查使用的libc.so文件的版本。这种方式有点困难。您可以在此链接中检查:Linux: Check the glibc version


5
您可以使用"strings"命令来检查编译器的GLIBC版本。适用最高版本。
ubuntu1604:extra$ strings ./arm-unknown-linux-gnueabi/bin/arm-unknown-linux-gnueabi-gcc | grep GLIBC
    GLIBC_2.3
    GLIBC_2.8
    GLIBC_2.14
    GLIBC_2.4
    GLIBC_2.11
    GLIBC_2.2.5
    GLIBC_2.3.4

4
请注意,这并不能真正告诉您版本信息。假设二进制文件是链接到glibc 2.17的,但恰好没有引用任何符号版本晚于“GLIBC_2.14”的符号。那么它很容易产生相同的符号版本列表。 - Florian Weimer

0

此外,请检查libc的更高版本符号:

readelf -V /lib64/libc.so.6

0

首先执行

ldd which cat | grep libc

以查找

libc.so.6

如果输出为例子

/lib/x86_64-linux-gnu/libc.so.6

然后运行它,输出结果将会是
GNU C Library (Ubuntu GLIBC 2.31-0ubuntu9.9) stable release version 2.31.
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 9.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接