Проверьте версию glibc для определенного компилятора gcc - PullRequest
44 голосов
/ 14 марта 2012

В моей системе установлено два компилятора gcc, один из них gcc 4.1.2 (по умолчанию), а другой - gcc 4.4.4. Как я могу проверить версию libc, используемую gcc 4.4.4, потому что /lib/libc.so.6 показывает glibc, используемый gcc 4.1.2, поскольку это компилятор по умолчанию.

Ответы [ 7 ]

40 голосов
/ 14 марта 2012

Напишите тестовую программу (назовите ее, например, 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.

31 голосов
/ 14 марта 2012

Используйте -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>.
29 голосов
/ 23 ноября 2013

еще проще

use ldd --version

Это должно вернуть используемую версию glibc, т.е.такой же результат, как и запуск моей библиотеки 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.

...

14 голосов
/ 14 июля 2017

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 году).

Если вы хотите, чтобы оболочка 'one-liner' выводила эти макросы, используйте:

echo '#include <errno.h>' | gcc -xc - -E -dM | 
    grep -E '^#define __GLIBC(|_MINOR)__ ' | sort

Шаблон grep выбран для соответствия только двум релевантным макросам, потому что существуют десятки внутренних макросов с именем __GLIBC_somethingorother, которые вам не нужно читать.

9 голосов
/ 14 марта 2012

Я сомневаюсь, если в вашей системе установлено более одного glibc. Но ldd -v <path/to/gcc-4.x> должен дать вам используемый glibc.

6 голосов
/ 09 февраля 2019

Самый простой способ - использовать 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:

  1. Проверьте версию установленного пакета glibc rpm: запустите эту команду

    rpm -q glibc

  2. Проверьте версию используемого файла libc.so.Этот путь немного сложнее.Вы можете проверить это по этой ссылке: Linux: Проверьте версию glibc

0 голосов
/ 29 июня 2017

Вы можете использовать команду 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
...