Очевидною відповіддю, хоча і не найбільш вичерпною, є перевірка менеджера пакунків, наприклад
rpm -qi glibc
dpkg -l libc6
(На жаль, у glibc немає .pc
файлу pkconfig , тому pkgconfig --modversion glibc
це не є учасником.) Дивіться також чудову getconf
пропозицію @ Gnouc .
Найпростіший випадок, що стосується gcc + glibc, і той, який я в основному використовую перший, - це просто виконати libc.so
, як викладено в деяких інших відповідях тут. Не потрібно передавати жодних аргументів, вона виводить свою версію за замовчуванням. Це спрацьовує, наскільки glibc-2.1 (glibc-2.0 seg-несправності, хоча назад, тоді ви можете перевірити glibcbug
сценарій (зараз у відставці) для підтвердження версії). Цей метод також працює з останніми (> 0,9.15) версіями musl-libc (що минуло 1,0 сьогодні, 20 березня). Він не працює з uClibc, він segfaults.
Один простий спосіб точно сказати, що ви gcc
збираєтеся зробити, - це компілювати:
#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;
}
(з glibc, <stdio.h>
включає, <features.h>
що визначає відповідні макроси GLIBC, вам потрібні <gnu/libc-version.h>
декларації функції.)
Це фіксує більш складні випадки (декілька libc та / або декілька компіляторів), припускаючи, що ви, звичайно, використовуєте правильний компілятор (і прапори). (Я підозрюю, що він не дозволить розрізнити власне eglibc та glibc.)
Якщо ви впевнені, що використовуєте glibc (або eglibc), ld
ви також підтвердите версію (вибачте, це невірно).
Якщо __GNU_LIBRARY__
не визначено, ви отримаєте помилки, тоді настає час для плану Б.
gcc -dumpmachine
може допомогти, наприклад, для uclibc він має -uclibc
суфікс gcc -dumpspecs | grep dynamic-linker
. Це також може означати ABI.
gcc -print-file-name=libc.so
підкаже, який файл використовуватиме компілятор для " -lc
", це майже напевно лінк-скрипт у вашій установці gcc, який ви можете прочитати як звичайний текст. Це покаже точний шлях до libc.so
. Це також спрацює, якщо ви передаєте прапори, як -m32
або -m64
.
У разі , якщо ви використовуєте uclibc (як використовуються OpenWRT і більше), воно визначає __UCLIBC_MAJOR__
, __UCLIBC_MINOR__
і __UCLIBC_SUBLEVEL__
так само , як __UCLIBC__
в <features.h>
, так що це легко виявляється з допомогою зміни незначного за вищевказаною C фрагменті коду. В інтересах сумісності uClibc може також визначити макроси GNU / GLIBC, як це було використано вище, в даний час він видає себе за glibc-2.2. Вона в даний час не виконувати gnu_get_libc_X()
функції, але це здійснити , getconf
який також може ввести в оману (я підозрюю , що він повертає порожній відповідь на getconf GNU_LIBC_VERSION
мій білд окр дметься сьогодні , тому я не можу підтвердити.)
У тому випадку, коли ви використовуєте dietlibc , запущена diet -v
версія відобразить версію.
(FWIW, протягом декількох років із програмним забезпеченням, що використовує autoconf, у мене було більше проблем із неперевіреною системою gcc
та g++
вимогами, ніж із перевіреними функціями glibc.)