我在系统上安装了两个gcc编译器,一个是gcc 4.1.2
(默认),另一个是gcc 4.4.4
。 我该如何检查gcc 4.4.4
使用的libc版本,因为/lib/libc.so.6
显示的是gcc 4.1.2
使用的glibc,因为它是默认编译器。
我在系统上安装了两个gcc编译器,一个是gcc 4.1.2
(默认),另一个是gcc 4.4.4
。 我该如何检查gcc 4.4.4
使用的libc版本,因为/lib/libc.so.6
显示的是gcc 4.1.2
使用的glibc,因为它是默认编译器。
更加简单易懂
使用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.
...
ldd
链接的内容。在链接程序时,您会链接到某个libc
实现(可能不止一个),而不是ldd
。 - Maxim Egorushkin编写一个测试程序(例如将其命名为 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版本。
ldd --version
吗? - Kevdog777使用-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>.
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)'
。 - jwwgnu_get_libc_version()
,因此“Not the GNU C Library”不太准确。 - pevik__GLIBC__
吗?(不应该这样。) - zwol__GLIBC__ 2
和__GLIBC_MINOR__ 2
,这可能是他们完全支持的内容。glibc 2.2于2000年11月9日发布(18年前),如果你比较两个项目的头文件,它们看起来很相似。 - pevik我怀疑你的系统中是否安装了多个glibc。但是,ldd -v <path/to/gcc-4.x>
命令可以告诉你所使用的glibc版本。
-v
在我的情况下是一个绝妙的建议,帮助我清楚地看到缺少了哪些库版本。 - Artem Russakovskii最简单的方法是使用随附于glibc
的ldd
。
只需运行以下命令: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版本:
检查已安装的glibc rpm包的版本:通过运行以下命令来完成
rpm -q glibc
检查使用的libc.so文件的版本。这种方式有点困难。您可以在此链接中检查:Linux: Check the glibc version
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
此外,请检查libc的更高版本符号:
readelf -V /lib64/libc.so.6
首先执行
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>.