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

时间:2012-03-14 16:10:43

标签: c 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,因为它是默认编译器。

8 个答案:

答案 0 :(得分:35)

编写测试程序(例如将其命名为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版本。

答案 1 :(得分:30)

使用-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:
<http://www.gnu.org/software/libc/bugs.html>.

答案 2 :(得分:28)

更容易

使用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.

...

答案 3 :(得分:13)

PROGRAM OPENMP_PARALLEL_STIFF USE omp_lib IMPLICIT NONE INTEGER :: I, J INTEGER, PARAMETER :: RTOT=10, STOT=15 INTEGER :: TID INTEGER, PARAMETER :: NUM_THREADS=8 DOUBLE PRECISION :: T_INITIAL, T_FINAL CALL OMP_SET_NUM_THREADS(NUM_THREADS) CALL CPU_TIME(T_INITIAL) PRINT*, "TIME INITIAL ",T_INITIAL !$OMP PARALLEL DO PRIVATE(I,J,TID) DO I=1,RTOT DO J=1,STOT TID=OMP_GET_THREAD_NUM() CALL STIFF_DRIVER(TID,I,J,RTOT,STOT) END DO END DO !$OMP END PARALLEL DO CALL CPU_TIME(T_FINAL) PRINT*, "TIME FINAL ",T_FINAL PRINT*, "TIME ELAPSED ",(T_FINAL-T_INITIAL)/NUM_THREADS END PROGRAM OPENMP_PARALLEL_STIFF SUBROUTINE STIFF_DRIVER(TID,II,JJ,RTOT,STOT) USE USEFUL_PARAMETERS_N_FUNC USE DVODE_F90_M ! Type declarations: IMPLICIT NONE ! Number of odes for the problem: INTEGER :: SERIAL_NUMBER, TID INTEGER :: II, JJ, RTOT, STOT, IND INTEGER :: J, NTOUT INTEGER :: ITASK, ISTATE, ISTATS, I ! parameters : declaration DOUBLE PRECISION, PARAMETER :: s0=0.450D0, dr=1.0D-4, ds=1.0D-2 DOUBLE PRECISION, DIMENSION(NEQ) :: Y, YOUT DOUBLE PRECISION :: ATOL, RTOL, RSTATS, T, TOUT, EPS, TFINAL, DELTAT DIMENSION :: RSTATS(22), ISTATS(31) DOUBLE PRECISION :: bb, cc, ba, ba1, eta CHARACTER(len=45) :: filename TYPE (VODE_OPTS) :: OPTIONS SERIAL_NUMBER=3011+II+(JJ-1)*RTOT IND=TID+3011+II+(JJ-1)*RTOT WRITE (*,12)SERIAL_NUMBER,TID 12 FORMAT ("SL. NO. ",I5," THREAD NO.",I3) r=(II-1)*dr s=s0+JJ*ds EPS = 1.0D-9 ! Open the output file: WRITE (filename,93)r,s 93 FORMAT ("r_",f6.4,"_s_",f4.2,".txt") OPEN (UNIT=IND,FILE=filename,STATUS='UNKNOWN',ACTION='WRITE') ! Parameters for the stiff ODE system q0 = 0.60D0; v = 3.0D0 Va = 20.0D-4; Vs = 1.0D-1 e1 = 1.0D-1; e2 = 1.10D-5; e3 = 2.3D-3; e4=3.0D-4 del = 1.7D-4; mu = 5.9D-4 al = 1.70D-4; be = 8.9D-4; ga = 2.5D-1 ! S and r dependent parameters e1s = e1/s; e2s = e2/(s**2); e3s = e3/s; e4s = e4/s dels = del*s; rs = r*s e1v = e1/v; e2v = e2/(v**2); e3v = e3/v; e4v = e4/v delv = del*v; rv = r*v ! SET INITIAL PARAMETERS for INTEGRATION ROUTINES T = 0.0D0 TFINAL = 200.0D0 DELTAT = 0.10D0 NTOUT = INT(TFINAL/DELTAT) RTOL = EPS ATOL = EPS ITASK = 1 ISTATE = 1 ! Set the initial conditions: USING MODULE USEFUL_PARAMETERS_N_FUNC CALL Y_INITIAL(NEQ,Y) ! Set the VODE_F90 options: OPTIONS = SET_OPTS(DENSE_J=.TRUE.,USER_SUPPLIED_JACOBIAN=.FALSE., & RELERR=RTOL,ABSERR=ATOL,MXSTEP=100000) ! Integration: DO I=1,NTOUT TOUT = (I-1)*DELTAT CALL DVODE_F90(F_FUNC,NEQ,Y,T,TOUT,ITASK,ISTATE,OPTIONS) ! Stop the integration in case of an error IF (ISTATE<0) THEN WRITE (*,*)"ISTATE ", ISTATE STOP END IF ! WRITE DATA TO FILE WRITE (IND,*) TOUT,T, Y(NEQ-2) END DO CLOSE(UNIT=IND) RETURN END SUBROUTINE STIFF_DRIVER 标识GNU C库的运行时版本。

如果您关心的是编译时版本(即在gnu_get_libc_version中提供标题的版本),您应该查看宏/usr/include__GLIBC__。它们扩展为正整数,并将定义为包含GNU C库提供的任何头文件的副作用;这意味着您可以添加标准标头,然后使用__GLIBC_MINOR__来决定是否可以包含#ifdef __GLIBC__之类的非标准标头。

从接受的答案中扩展测试程序:

gnu/libc-version.h

当我在计算机上编译并运行此程序时,我正在键入此答案(这是一台Mac),它打印

#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
}

但是当编译并在附近的Linux机器上运行时,它会打印

Not the GNU C Library

在正常情况下,“运行时”版本可能比“编译时”版本大,但从不小。主版本号不太可能再次改变(最后一次更改是1997年的“libc6过渡”)。

如果您希望使用shell“one-liner”转储这些宏,请使用:

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

选择echo '#include <errno.h>' | gcc -xc - -E -dM | grep -E '^#define __GLIBC(|_MINOR)__ ' | sort 模式仅匹配两个相关的宏,因为有许多名为grep的内部宏您不想阅读。

答案 4 :(得分:9)

我怀疑你的系统中是否安装了多个glibc。但是ldd -v <path/to/gcc-4.x>应该给你使用的glibc。

答案 5 :(得分:6)

最简单的方法是使用ldd附带的glibc

只需运行以下命令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

答案 6 :(得分:0)

另外,检查libc的更高版本控制符号:

readelf -V /lib64/libc.so.6

答案 7 :(得分:-1)

您可以使用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
相关问题