Check glibc version for a particular gcc compiler

84,214

Solution 1

Write a test program (name it for example 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);
}

and compile it with the gcc-4.4 compiler:

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

When you execute ./glibc-version the used glibc version is shown.

Solution 2

even easier

use ldd --version

This should return the glibc version being used i.e.

$ 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

...

which is the same result as running my libc library

$ /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.

...

Solution 3

Use -print-file-name gcc option:

$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so

That gives the path. Now:

$ 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 ) )

Looks like a linker script. libc is special on Linux in that it can be executed:

$ /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>.

Solution 4

gnu_get_libc_version identifies the runtime version of the GNU C Library.

If what you care about is the compile-time version (that is, the version that provided the headers in /usr/include), you should look at the macros __GLIBC__ and __GLIBC_MINOR__. These expand to positive integers, and will be defined as a side-effect of including any header file provided by the GNU C Library; this means you can include a standard header, and then use #ifdef __GLIBC__ to decide whether you can include a nonstandard header like gnu/libc-version.h.

Expanding the test program from the accepted answer:

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

When I compile and run this program on the computer I'm typing this answer on (which is a Mac) it prints

Not the GNU C Library

but when compiled and run on a nearby Linux box it prints

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

Under normal circumstances, the "runtime" version could be bigger than the "compile-time" version, but never smaller. The major version number is unlikely ever to change again (the last time it changed was the "libc6 transition" in 1997).

If you would prefer a shell 'one-liner' to dump these macros, use:

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

The grep pattern is chosen to match only the two macros that are relevant, because there are dozens of internal macros named __GLIBC_somethingorother that you don't want to have to read through.

Solution 5

I doubt if you have more than one glibc installed in your system.But ldd -v <path/to/gcc-4.x> should give you the glibc used.

Share:
84,214
MetallicPriest
Author by

MetallicPriest

Updated on April 07, 2020

Comments

  • MetallicPriest
    MetallicPriest about 4 years

    I have two gcc compilers installed on my system, one is gcc 4.1.2 (default) and the other is gcc 4.4.4. How can I check the libc version used by gcc 4.4.4, because /lib/libc.so.6 shows the glibc used by gcc 4.1.2, since it is the default compiler.

  • Ciro Santilli OurBigBook.com
    Ciro Santilli OurBigBook.com almost 11 years
    it works for me, but where is this docummented? I'm looking at the glibc 2.7 docs but I can't find it.
  • R1tschY
    R1tschY almost 11 years
    The function is part of the Gnulib: gnu.org/software/gnulib/manual/gnulib.html
  • Adam
    Adam about 10 years
    Results from above commands are not the same. On my computer : GNU libc version: 2.17, ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ??
  • Kevdog777
    Kevdog777 over 9 years
    Can you not just put ldd --version?
  • Koray Tugay
    Koray Tugay almost 9 years
    I use OSX and I am getting ==> fatal error: 'gnu/libc-version.h' file not found <== Why might this be? Does not osx come with standard c library?
  • RandomDSdevel
    RandomDSdevel about 7 years
    @KorayTugay: Well, yes, but OS X/macOS started switching over from GCC to LLVM/Clang (though it did have an instance of LLVM-GCC available for a little while) all the way back with the release of Xcode 3.1, IIRC, so you'd have to look for Clang's C standard library.
  • jww
    jww almost 7 years
    And from comments on a related question: echo '#include <errno.h>' | gcc -x c -dM -E - | egrep -i '(gnu|lib)'.
  • Florian Weimer
    Florian Weimer almost 7 years
    Note that this does not really tell you the version. Let's assume that the binary was linked against glibc 2.17, but happened not to reference any symbols with symbol versions later than GLIBC_2.14. Then it could easily produce the same list of symbol versions.
  • zwol
    zwol about 6 years
    OSX has never used the GNU C Library; its Unix userspace is all BSD-derived. It did originally use GCC as its system compiler, but Apple as an organization is allergic to the GPLv3; it is not an accident that they started funding LLVM heavily right after GCC's licensing was changed over.
  • pevik
    pevik almost 6 years
    Uclibc-ng supports gnu_get_libc_version(), so "Not the GNU C Library" is not precise.
  • zwol
    zwol almost 6 years
    @pevik Does it define __GLIBC__? (It shouldn't.)
  • pevik
    pevik almost 6 years
    @zwol Yes, it does: in features.h, which is used in gnu/libc-version.h.
  • zwol
    zwol almost 6 years
    @pevik I would say that's a bug in uclibc, unless it already supports every single glibc extension, which seems unlikely.
  • pevik
    pevik almost 6 years
    @zwol IMHO it's not. They define __GLIBC__ 2 and __GLIBC_MINOR__ 2 in features.h, which is what they probably fully support. glibc 2.2 was released 2000-11-09 (18 years ago) and if you compare headers from both projects, they look similar.
  • pevik
    pevik almost 6 years
    @zwol see also blogs.gentoo.org/blueness/2016/03/31/why-macros-like-glibc-a‌​nd-uclibc-are-bad/