检查特定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