Überprüfen Sie die glibc-Version für einen bestimmten gcc-Compiler

Lesezeit: 2 Minuten

Ich habe zwei gcc-Compiler auf meinem System installiert, einer ist gcc 4.1.2 (Standard) und die andere ist gcc 4.4.4. Wie kann ich die verwendete libc-Version überprüfen? gcc 4.4.4Weil /lib/libc.so.6 zeigt die von verwendete glibc gcc 4.1.2da es sich um den Standardcompiler handelt.

  • Wenn Sie die Überprüfung zur Kompilierzeit durchführen möchten, ist die Antwort von Zwol unten wahrscheinlich die beste Methode. Wenn Sie die Version zur Laufzeit überprüfen möchten, ist die Antwort von R1tschY wahrscheinlich die beste Methode. Beachten Sie, dass Sie möglicherweise nicht die Glibc-Version oder die Standard-C++-Bibliotheksversion erhalten, die Sie zur Laufzeit erwarten, da Linux nicht in der Lage ist, die Pfade selbst richtig hinzubekommen. Siehe auch Verknüpfung von g++ 4.8 mit libstdc++

    – jww

    14. Juli 2017 um 16:51 Uhr


Benutzeravatar von John
John

sogar einfacher

verwenden ldd --version

Dies sollte die verwendete Glibc-Version zurückgeben, dh

$ 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

Dies ist das gleiche Ergebnis wie das Ausführen meiner libc-Bibliothek

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

  • Die Ergebnisse der obigen Befehle sind nicht identisch. Auf meinem Computer: GNU libc Version: 2.17, ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 ??

    – Adam

    26. April 2014 um 9:53 Uhr


  • Das zeigt was ldd mit verknüpft war. Beim Verknüpfen von Programmen verlinken Sie mit einigen Implementierungen von libc (es können mehrere sein), nicht mit ldd.

    – Maxim Egorushkin

    9. August um 16:50 Uhr


Benutzeravatar von R1tschY
R1tschY

Schreiben Sie ein Testprogramm (benennen Sie es z 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);
}

und kompilieren Sie es mit dem gcc-4.4-Compiler:

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

Wenn Sie ausführen ./glibc-version die verwendete Glibc-Version wird angezeigt.

  • Bei mir funktioniert es, aber wo ist das dokumentiert? Ich schaue in der glibc 2.7-Dokumentation aber ich kann es nicht finden.

    – Ciro Santilli OurBigBook.com

    27. Juni 2013 um 9:58 Uhr


  • Die Funktion ist Teil der Gnulib: gnu.org/software/gnulib/manual/gnulib.html

    – R1tschY

    9. Juli 2013 um 9:29 Uhr

  • Kannst du nicht einfach setzen ldd --version?

    – Kevdog777

    20. Januar 2015 um 15:05 Uhr

  • Ich verwende OSX und bekomme ==> fatal error: ‘gnu/libc-version.h’ file not found <== Woran kann das liegen? Kommt OSX nicht mit der Standard-C-Bibliothek?

    – Koray Tugay

    11. Juni 2015 um 10:32 Uhr

  • OSX hat noch nie verwendete die GNU C-Bibliothek; sein Unix-Userspace ist vollständig von BSD abgeleitet. Ursprünglich wurde GCC als Systemcompiler verwendet, aber Apple als Organisation ist allergisch gegen die GPLv3; Es ist kein Zufall, dass sie begonnen haben, LLVM stark zu finanzieren Rechts nachdem die Lizenzierung von GCC umgestellt wurde.

    – zol

    20. Februar 2018 um 14:34 Uhr

Benutzeravatar von Maxim Egorushkin
Maxim Egorushkin

Verwenden -print-file-name gcc Möglichkeit:

$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/libc.so

Das gibt den Weg. Lassen Sie uns die Datei untersuchen:

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

Die Datei ist ein Linker-Skript, das die Bibliotheken darin verlinkt GROUP aufführen.


Auf ELF-Plattformen /lib/x86_64-linux-gnu/libc.so.6 ist eine positionsunabhängige ausführbare Datei mit einer dynamischen Symboltabelle (wie die einer gemeinsam genutzten Bibliothek):

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

Benutzeravatar von twol
zwöl

gnu_get_libc_version identifiziert die Laufzeit Version der GNU-C-Bibliothek.

Wenn Ihnen das wichtig ist Kompilierzeit version (d. h. die Version, die die Header in bereitgestellt hat /usr/include), sollten Sie sich die Makros ansehen __GLIBC__ und __GLIBC_MINOR__. Diese werden zu positiven ganzen Zahlen erweitert und werden als Nebeneffekt des Einschließens definiert irgendein Header-Datei, bereitgestellt von der GNU C Library; Das bedeutet, dass Sie einen Standard-Header einfügen und dann verwenden können #ifdef __GLIBC__ um zu entscheiden, ob Sie einen nicht standardmäßigen Header wie einfügen können gnu/libc-version.h.

Erweiterung des Testprogramms aus der akzeptierten Antwort:

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

Wenn ich dieses Programm auf dem Computer kompiliere und ausführe, auf dem ich diese Antwort eingebe (was ein Mac ist), wird es gedruckt

Not the GNU C Library

aber wenn es kompiliert und auf einer nahe gelegenen Linux-Box ausgeführt wird, wird es gedruckt

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

Unter normalen Umständen könnte die “Runtime”-Version größer als die “Compile-Time”-Version sein, aber niemals kleiner. Es ist unwahrscheinlich, dass sich die Hauptversionsnummer jemals wieder ändert (das letzte Mal, dass sie sich geändert hat, war der „libc6-Übergang“ im Jahr 1997).

Wenn Sie einen Shell-Einzeiler bevorzugen, um diese Makros auszugeben, verwenden Sie:

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

Das grep Muster wird so gewählt, dass es nur mit den beiden relevanten Makros übereinstimmt, da Dutzende von internen Makros benannt sind __GLIBC_somethingorother die man nicht durchlesen möchte.

Ich bezweifle, dass auf Ihrem System mehr als eine glibc installiert ist. Aber ldd -v <path/to/gcc-4.x> solltest du die glibc verwenden.

Benutzeravatar von DINA TAKLIT
DINA TAKLIT

Der einfachste Weg ist die Verwendung ldd was dazugehört glibc

Führen Sie einfach diesen Befehl aus 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.

Es gibt zwei zusätzliche Möglichkeiten, um die glibc-Version herauszufinden:

  1. Überprüfen Sie die Version des installierten Glibc-RPM-Pakets: Führen Sie dazu diesen Befehl aus

    rpm -q glibc

  2. Überprüfen Sie die Version der verwendeten libc.so-Datei. Dieser Weg ist etwas schwieriger. Sie können es in diesem Link überprüfen: Linux: Überprüfen Sie die glibc-Version

Benutzeravatar von Neeraj Kumar
Neeraj Kumar

Sie können den Befehl strings verwenden, um die GLIBC-Version des Compilers zu überprüfen. Es gilt die höchste 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

  • Beachten Sie, dass dies Ihnen nicht wirklich die Version mitteilt. Nehmen wir an, dass die Binärdatei gegen glibc 2.17 gelinkt wurde, aber zufällig keine Symbole mit Symbolversionen später als referenziert GLIBC_2.14. Dann könnte es leicht dieselbe Liste von Symbolversionen erzeugen.

    – Florian Weimer

    17. Juli 2017 um 11:05 Uhr

1415390cookie-checkÜberprüfen Sie die glibc-Version für einen bestimmten gcc-Compiler

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy