Oczywistą odpowiedzią, choć nie najbardziej wyczerpującą, jest sprawdzenie menedżera pakietów, np
rpm -qi glibc
dpkg -l libc6
(Niestety, glibc nie ma .pc
pliku pkconfig , więc nie jest programem uruchamiającym pkgconfig --modversion glibc
.) Zobacz także doskonałą getconf
sugestię @ Gnouc .
Najprostszym przypadkiem, z gcc + glibc, i tym, którego najczęściej używam jako pierwszego, jest po prostu wykonanie libc.so
, jak opisano w niektórych innych odpowiedziach tutaj. Nie trzeba przekazywać żadnych argumentów, domyślnie wyświetla ona swoją wersję. To działa aż do glibc-2.1 (seg-fault glibc-2.0, choć dawno temu można było sprawdzić (obecnie wycofany) glibcbug
skrypt, aby potwierdzić wersję). Ta metoda działa również z najnowszymi (> 0.9.15) wersjami musl-libc (które właśnie weszły 1.0 dzisiaj, 20 marca). Nie działa z uClibc, powoduje awarie.
Jednym prostym sposobem na dokładne określenie, co gcc
zamierzasz zrobić, jest kompilacja:
#include <gnu/libc-version.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("%s %s\n",gnu_get_libc_version(),gnu_get_libc_release());
printf("glibc v%i %i.%i\n",__GNU_LIBRARY__,__GLIBC__,__GLIBC_MINOR__);
return 0;
}
(z glibc, <stdio.h>
zawiera <features.h>
który określa odpowiednie makra glibc musisz <gnu/libc-version.h>
do deklaracji funkcji.)
Łapie to bardziej złożone przypadki (wiele bibliotek libc i / lub wiele kompilatorów), zakładając oczywiście, że używasz właściwego kompilatora (i flag). (Podejrzewam, że nie rozróżnia jednak właściwego eglibc od glibc).
Jeśli masz pewność, że używasz glibc (lub eglibc) ld
, potwierdzi również wersję (przepraszam, to nie jest poprawne).
Jeśli __GNU_LIBRARY__
nie zostanie zdefiniowane, pojawią się błędy, czas na plan B.
gcc -dumpmachine
może pomóc, np. dla uclibc ma -uclibc
sufiks, tak jak może gcc -dumpspecs | grep dynamic-linker
. Może to również oznaczać ABI.
gcc -print-file-name=libc.so
powie ci, jakiego pliku użyje kompilator dla „ -lc
”, jest to prawie na pewno skrypt łączący w instalacji gcc, który możesz odczytać jako zwykły tekst. To pokaże dokładną ścieżkę do libc.so
. Będzie to również działać, jeśli podajesz flagi takie jak -m32
lub -m64
.
W przypadku korzystania z uclibc (używanego przez OpenWRT i inne), definiuje on __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
a __UCLIBC_SUBLEVEL__
także __UCLIBC__
w <features.h>
, więc można go łatwo wykryć za pomocą niewielkiej odmiany powyższego fragmentu kodu C. W interesie kompatybilności uClibc może również definiować makra GNU / GLIBC, jak użyto powyżej, obecnie udaje, że jest glibc-2.2. Nie ma obecnie realizować gnu_get_libc_X()
funkcje, ale nie wdrożyć getconf
które również mogą wprowadzać w błąd (podejrzewam, że zwraca pustą odpowiedź na getconf GNU_LIBC_VERSION
mój build env jest dąsać dzisiaj więc nie mogę potwierdzić).
W mało prawdopodobnym przypadku korzystania z dietlibc , bieganie diet -v
wyświetli wersję.
(FWIW, przez kilka lat z oprogramowaniem używającym autoconf miałem więcej problemów z niesprawdzonymi gcc
i g++
wymaganymi wymaganiami niż z sprawdzonymi funkcjami glibc).