Проверить версию glibc для конкретного компилятора gcc

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


person MetallicPriest    schedule 14.03.2012    source источник
comment
Если вы хотите выполнить проверку во время компиляции, ответ Zwol ниже, вероятно, лучший метод. Если вы хотите проверить версию во время выполнения, ответ R1tschY, вероятно, будет лучшим методом. Обратите внимание, что вы можете не получить версию Glibc или стандартную версию библиотеки C ++, которую ожидаете во время выполнения, из-за неспособности Linux самостоятельно получить правильные пути. Также см. Связывание g ++ 4.8 с libstdc ++   -  person jww    schedule 14.07.2017


Ответы (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.

person R1tschY    schedule 14.03.2012
comment
у меня это работает, но где это документировано? Я ищу документацию по glibc 2.7, но могу не найду. - person Ciro Santilli 新疆再教育营六四事件ۍ 27.06.2013
comment
Эта функция является частью Gnulib: gnu.org/software/gnulib/manual/ gnulib.html - person R1tschY; 09.07.2013
comment
А нельзя просто ldd --version поставить? - person Kevdog777; 20.01.2015
comment
Я использую OSX и получаю == ›фатальная ошибка: файл 'gnu / libc-version.h' не найден‹ == Почему это могло быть? Разве osx не поставляется со стандартной библиотекой c? - person Koray Tugay; 11.06.2015
comment
@KorayTugay: Ну да, но OS X / macOS начала переключаться с GCC на LLVM / Clang (хотя у него действительно был экземпляр LLVM-GCC, доступный какое-то время) с самого начала с выпуск Xcode 3.1, IIRC, поэтому вам придется искать стандартную библиотеку C Clang. - person RandomDSdevel; 14.05.2017
comment
OSX никогда не использовала библиотеку GNU C; все его пользовательское пространство Unix является производным от BSD. Первоначально она использовала GCC в качестве системного компилятора, но Apple как организация испытывает аллергию на GPLv3; не случайно они начали активно финансировать LLVM сразу после того, как лицензирование GCC было изменено. - person zwol; 20.02.2018

даже проще

используйте 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.

...

person John    schedule 22.11.2013
comment
Результаты вышеперечисленных команд не совпадают. На моем компьютере: версия GNU libc: 2.17, ld-linux-x86-64.so.2 (GLIBC_2.3) = ›/lib64/ld-linux-x86-64.so.2 ?? - person Adam; 26.04.2014

Используйте параметр -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>.
person Maxim Egorushkin    schedule 14.03.2012
comment
ой, я думал, тебе нужен путь, моя плохая. - person Maxim Egorushkin; 15.03.2012

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, которые вы не хотите читать.

person zwol    schedule 14.07.2017
comment
И из комментариев к соответствующему вопросу: echo '#include <errno.h>' | gcc -x c -dM -E - | egrep -i '(gnu|lib)'. - person jww; 14.07.2017
comment
Uclibc-ng поддерживает gnu_get_libc_version(), поэтому библиотека GNU C не точна. - person pevik; 13.08.2018
comment
@pevik Это определяет __GLIBC__? (Не должно.) - person zwol; 13.08.2018
comment
@zwol Да, это так: в features.h, который используется в gnu / libc-version.h. - person pevik; 14.08.2018
comment
@pevik Я бы сказал, что это ошибка в uclibc, если только он уже не поддерживает каждое отдельное расширение glibc, что кажется маловероятным. - person zwol; 14.08.2018
comment
@zwol ИМХО это не так. Они определяют __GLIBC__ 2 и __GLIBC_MINOR__ 2 в функциях . h, что они, вероятно, полностью поддерживают. glibc 2.2 был выпущен 2000-11-09 (18 лет назад), и если вы сравните заголовки из обоих проектов, они будут похожи. - person pevik; 14.08.2018
comment
@zwol см. также blogs.gentoo.org/blueness/2016 / 03/31 / why-macros-like- glibc -and- uclibc -are-bad / - person pevik; 14.08.2018

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

person itisravi    schedule 14.03.2012

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

person DINA TAKLIT    schedule 09.02.2019

Вы можете использовать команду 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
person Neeraj    schedule 29.06.2017
comment
Обратите внимание, что это не совсем точная версия. Предположим, что двоичный файл был связан с glibc 2.17, но не ссылался ни на какие символы с версиями символов позже GLIBC_2.14. Тогда он мог бы легко создать тот же список версий символа. - person Florian Weimer; 17.07.2017

Также проверьте символ более высокого уровня версии библиотеки libc:

readelf -V /lib64/libc.so.6
person drgnfr    schedule 07.04.2020