检查特定gcc编译器的glibc版本
我的系统上安装了两个gcc编译器,一个是gcc 4.1.2
(默认),另一个是gcc 4.4.4
。 我如何检查gcc 4.4.4
使用的libc版本,因为/lib/libc.so.6
显示了gcc 4.1.2
使用的glibc,因为它是默认的编译器。
编写测试程序(例如将其命名为glibc-version.c
):
#include #include #include 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版本。
使用-print-file-name
gcc
选项:
$ gcc -print-file-name=libc.so /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
这给了路径。 现在:
$ file /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so: ASCII C program text $ cat /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/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 ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
看起来像链接器脚本。 libc
在Linux上是特殊的,因为它可以执行:
$ /lib64/libc.so.6 GNU C Library stable release version 2.13, by Roland McGrath et al. Copyright (C) 2011 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 4.5.1 20100924 (Red Hat 4.5.1-4). Compiled on a Linux 2.6.35 system on 2011-08-05. Available extensions: Support for some architectures added on, not maintained in glibc core. The C stubs add-on version 2.1.2. crypt add-on version 2.1 by Michael Glad and others GNU Libidn by Simon Josefsson Native POSIX Threads Library by Ulrich Drepper et al BIND-8.2.3-T5B RT using linux kernel aio libc ABIs: UNIQUE IFUNC For bug reporting instructions, please see: .
更容易
使用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.
…
gnu_get_libc_version
标识GNU C库的运行时版本。
如果您关心的是编译时版本(即在/usr/include
中提供标头的版本),您应该查看宏__GLIBC__
和__GLIBC_MINOR__
。 这些扩展为正整数,并将定义为包含GNU C库提供的任何头文件的副作用; 这意味着您可以包含标准标头,然后使用#ifdef __GLIBC__
来决定是否可以包含非标准标头,如gnu/libc-version.h
。
从接受的答案扩展测试程序:
#include #ifdef __GLIBC__ #include #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’one-liner’转储这些宏,请使用:
echo '#include ' | gcc -xc - -E -dM | grep -E '^#define __GLIBC(|_MINOR)__ ' | sort
选择grep
模式只匹配两个相关的宏,因为有许多名为__GLIBC_somethingorother
的内部宏,你不想阅读它们。
我怀疑你的系统中是否安装了多个glibc。但是ldd -v
应该给你使用的glibc。
您可以使用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