Очевидною відповіддю, хоча і не найбільш вичерпною, є перевірка менеджера пакунків, наприклад
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.)