В моей системе установлены два компилятора gcc, один - gcc 4.1.2
(по умолчанию), а другой - gcc 4.4.4
. Как я могу проверить версию libc, используемую gcc 4.4.4
, потому что /lib/libc.so.6
показывает glibc, используемую gcc 4.1.2
, поскольку это компилятор по умолчанию.
Проверить версию glibc для конкретного компилятора gcc
Ответы (8)
Напишите тестовую программу (назовите ее, например, 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);
}
и скомпилируйте его с помощью компилятора gcc-4.4:
gcc-4.4 glibc-version.c -o glibc-version
Когда вы выполняете ./glibc-version
, отображается использованная версия glibc.
ldd --version
поставить?
- person Kevdog777; 20.01.2015
даже проще
используйте ldd --version
Это должно вернуть используемую версию glibc, т.е.
$ 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
...
что такое же, как и при запуске моей библиотеки libc
$ /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.
...
Используйте параметр -print-file-name
gcc
:
$ gcc -print-file-name=libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
Это дает путь. Теперь:
$ file /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/libc.so: ASCII C program text
$ cat /usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../lib64/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 ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )
Похоже на скрипт компоновщика. libc
является особенным в Linux тем, что может выполняться:
$ /lib64/libc.so.6
GNU C Library stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 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 4.5.1 20100924 (Red Hat 4.5.1-4).
Compiled on a Linux 2.6.35 system on 2011-08-05.
Available extensions:
Support for some architectures added on, not maintained in glibc core.
The C stubs add-on version 2.1.2.
crypt add-on version 2.1 by Michael Glad and others
GNU Libidn by Simon Josefsson
Native POSIX Threads Library by Ulrich Drepper et al
BIND-8.2.3-T5B
RT using linux kernel aio
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.gnu.org/software/libc/bugs.html>.
gnu_get_libc_version
обозначает версию времени выполнения библиотеки GNU C.
Если вас интересует версия времени компиляции (то есть версия, которая предоставила заголовки в /usr/include
), вам следует взглянуть на макросы __GLIBC__
и __GLIBC_MINOR__
. Они расширяются до положительных целых чисел и будут определены как побочный эффект включения любого файла заголовка, предоставленного библиотекой GNU C; это означает, что вы можете включить стандартный заголовок, а затем использовать #ifdef __GLIBC__
, чтобы решить, можете ли вы включить нестандартный заголовок, например gnu/libc-version.h
.
Расширение тестовой программы из принятого ответа:
#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
}
Когда я компилирую и запускаю эту программу на компьютере, на котором я набираю этот ответ (это Mac), он печатает
Not the GNU C Library
но при компиляции и запуске на ближайшем Linux-сервере он печатает
GNU libc compile-time version: 2.24
GNU libc runtime version: 2.24
При нормальных обстоятельствах версия "времени выполнения" может быть больше, чем версия "времени компиляции", но никогда не меньше. Маловероятно, что основной номер версии когда-либо снова изменится (последний раз он менялся при «переходе к libc6» в 1997 году).
Если вы предпочитаете однострочную оболочку для вывода этих макросов, используйте:
echo '#include <errno.h>' | gcc -xc - -E -dM |
grep -E '^#define __GLIBC(|_MINOR)__ ' | sort
Шаблон grep
выбран для соответствия только двум актуальным макросам, потому что есть десятки внутренних макросов с именем __GLIBC_somethingorother
, которые вы не хотите читать.
echo '#include <errno.h>' | gcc -x c -dM -E - | egrep -i '(gnu|lib)'
.
- person jww; 14.07.2017
gnu_get_libc_version()
, поэтому библиотека GNU C не точна.
- person pevik; 13.08.2018
__GLIBC__
? (Не должно.)
- person zwol; 13.08.2018
__GLIBC__ 2
и __GLIBC_MINOR__ 2
в функциях . h, что они, вероятно, полностью поддерживают. glibc 2.2 был выпущен 2000-11-09 (18 лет назад), и если вы сравните заголовки из обоих проектов, они будут похожи.
- person pevik; 14.08.2018
Я сомневаюсь, что в вашей системе установлено более одного glibc, но ldd -v <path/to/gcc-4.x>
должен предоставить вам используемый glibc.
Самый простой способ - использовать ldd
, который поставляется с glibc
Просто запустите эту команду 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.
Есть два дополнительных способа узнать версию glibc:
Проверьте версию установленного пакета glibc rpm: для этого выполните эту команду
rpm -q glibc
Проверьте версию используемого файла libc.so. Этот способ немного сложнее. Вы можете проверить это по этой ссылке: Linux: проверьте версию glibc
Вы можете использовать команду strings, чтобы проверить версию компилятора GLIBC. Применяется самая высокая версия.
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
GLIBC_2.14
. Тогда он мог бы легко создать тот же список версий символа.
- person Florian Weimer; 17.07.2017
Также проверьте символ более высокого уровня версии библиотеки libc:
readelf -V /lib64/libc.so.6