Очевидный ответ, хотя и не самый полный, состоит в том, чтобы проверить ваш менеджер пакетов, например
rpm -qi glibc
dpkg -l libc6
(К сожалению, у glibc нет .pcфайла pkconfig , поэтому он не участвует pkgconfig --modversion glibc.) Смотрите также превосходное getconfпредложение @ Gnouc .
Простейший случай с gcc + glibc и тот, который я в основном использую первым, - просто выполнить libc.so, как описано в некоторых других ответах здесь. Нет необходимости передавать аргументы, по умолчанию выводится его версия. Это работает вплоть до glibc-2.1 (ошибки сегмента glibc-2.0, хотя еще тогда вы могли проверить (теперь уже удаленный) 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__не определено, вы получите ошибки, то пришло время для плана B.
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.)