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.4
Weil /lib/libc.so.6
zeigt die von verwendete glibc gcc 4.1.2
da es sich um den Standardcompiler handelt.
Überprüfen Sie die glibc-Version für einen bestimmten gcc-Compiler
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 vonlibc
(es können mehrere sein), nicht mitldd
.– Maxim Egorushkin
9. August um 16:50 Uhr
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
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>.
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.
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:
-
Überprüfen Sie die Version des installierten Glibc-RPM-Pakets: Führen Sie dazu diesen Befehl aus
rpm -q glibc
-
Ü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
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
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