как узнать версию glibc linux
Benohead’s Software Blog
Linux: Check the glibc version
If you need to check which version of the GNU C library (glibc) is used on you Linux system, whether it’s to check whether you are affected by the GHOST vulnerability or you need to install a software requiring at least a certain version but not checking it on build/installation, the easiest way is to use ldd which comes with glibc and should in most cases have the same version:
If you know you might have patched the system to use a different version of ldd and know that its version doesn’t match the glibc version, you have two additional ways to find out the glibc version:
The second way is a little bit more difficult. You first have to find which libc.so file is being used by a known program e.g. netstat:
You can also find the libc.so file used with the following command:
So we now know that /lib64/libc.so.6 is being used and we just need to get it’s version:
If you want to determine the glibc version from C program and not from a shell script, you can just use something like this:
You can then compile it and execute it like this to get the glibc version:
Of course, if your C file is not called glibc_version.c, you’ll have to use the name you’ve actually used in the gcc arguments.
Since your current shell is probably also using glibc, you can also find out which libc library it has loaded by using the following command:
узнать версию программы
Как узнать версию программы, находящейся в репозитории Debian, без помощи пакетных менеджеров?
Посмотреть на packages.debian.org?
Посмотреть на сайте Debian’а [pokerface.png]
ну или искать в man ключ.
Буду рад услышать от ылиты более Ъ-методы. Подписался.
Проwgetить ее каталог
без браузера желательно
дело в том, что у тс не debian
И без интернета? Но зачем? 🙂
Точнее проcurlить. Я даже однострочник наваял на коленке:
Извращенец?
aptitude versions package
Решает
спс, а чем так wine не угодил?
ну не debian у меня
потому что пиво дороже выходит при таком же количестве эффекта, а коньяк мне жинка запретила временно. Да, а вообще я против вина и за коньяк
Я думаю в этом твоя и проблема, что у тебя не debian.
А по теме думаю или packages качать, либо на packages.debian.org смотреть. Надо учитывать, что несколько веток (stable, testing, sid, experimental, backports) и то что пакет может немного называться по-другому в отличие от твоего дистра.
и не дебиан, и не сходить в интернет? Тогда только через libastral.
без помощи пакетных менеджеров
А имя пакета с программой и расположение его в зеркале телепатия подскажет.
Давай переформулируем вопрос. Как хоть в каком-нибудь дистрибутиве узнать версию программы без пакетного менеджера и без браузера?
Посему оговорку про коленку и написал. Сложный и правильный пример пусть пишут те, у кого неарч
Дубль два показывает версии исходников со странички(поправьте регекспы, мне лень):
В том-то и дело, что зная название пакета дёрнуть версию нетрудно. Тут ты всё правильно делаешь.
Но ведь в условии стоит «узнать версию программы». Т.е. пакет неизвестен. Вот я и пытаюсь узнать у ТС, как он без пакетного менеджера будет искать версию программы в консоли для любого дистра.
ааа. То есть ты распарсил как «узнать версию того же echo из coreutils без всего»?
спасибо, то что надо!
А разве не это имелось ввиду? 🙂
Зачем знать версию программы в разных дистрах как раз вопрос простой. Мало ли там, статистику собрать захотелось. Или автоматическое сравнение дистрибутивов какое.
Эксперимент по проверке библиотеки glibc
glibc
glibc — GNU C Library (GNU библиотека). Glibc является библиотекой Си, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и т.д. Библиотека C используется для всех динамически скомпонованных программ. Она написана Free Software Foundation для GNU операционных систем. glibc выпущена под лицензией GNU LGPL.
Не так давно в интернете появились новости, что вышла новая версия библиотеки glibc. Это подвигло нас на проверку этой библиотеки с помощью нашего анализатора PVS-Studio. А именно, была проверена версия glibc-2-19-90. К сожалению, на пару недель я отвлекся, поэтому нашёл время написать статью только сейчас. Я был занят большим сравнением нескольких статических анализаторов. Это очень важная для нас задача так как не перестают спрашивать, чем мы лучше Cppcheck и статического анализатора в Visual Studio 2013. Поэтому glibc пришлось немного подождать.
В чем сложность анализа
Незнакомым с внутренней кухней инструментов статического анализа, они кажутся очень простыми утилитами. Это не так. Это очень сложные программы.
С толку могут сбивать такие инструменты, как RATS. Если кто-то смотрел код RATS, то видел, что это просто поиск определённых имён функций в файлах. Этот инструмент тоже называется статическим анализатором кода. Однако, он очень далёк от того, чем занимаются настоящие анализаторы кода. Статический анализ, это вовсе не поиск с помощью регулярных выражений [1].
Неоднократно мы повторяли, что Linux-версия, это вовсе не тоже самое, что перекомпилированный исполняемый модуль [2]. Между исполняемым модулем и программным продуктом лежит пропасть. Одно из препятствий, поддержка специфичных расширений и тому подобное.
Что это такое, стороннему человеку совершенно непонятно. Вот от видит, в программе вызов функции strcmp():
И он даже не подозревает, в какой ужас может раскрываться эта строка после препроцессирования и какие нестандартные расширения будут использованы. Конкретно в нашем случае, строка превращается в это:
Анализатор не готов к такому повороту событий и временами выдаёт на подобных конструкциях бессмысленные ложные сообщения.
Поясню про ложные сообщения на более простом примере. Пусть у нас есть строка кода:
Макрос assert() раскрывается в следующий код:
V501 There are identical sub-expressions to the left and to the right of the ‘==’ operator: ((void *) — 1) == (void *) — 1 loadmsgcat.c 840
В умении корректно работать с такими конструкциями и состоит огромная часть работы по поддержке других компиляторов. Внешне эта работа не видна. Но она требует изучения особенностей компилятора и стандартных библиотек. Эти особенности надо изучить, поддержать и протестировать.
Надеюсь я приоткрыл маленькую щелочку, чтобы вы могли заглянуть в ад. В дальнейшем я планирую написать ряд статей, которые покажут сложность разработки инструментов статического анализа. Думаю, будет интересно.
Найденные подозрительные участки кода
Хотя проект glibc проверяется многими инструментами, кое что интересного всё-таки удалось найти. Давайте посмотрим на эти участки кода.
Странное выражение
V590 Consider inspecting this expression. The expression is excessive or contains a misprint. dcigettext.c 582
Условие можно упросить до:
Разыменование указателя до проверки
Не обязательно, это место опасно. Возможно, указатель никогда не может быть равен нулю. Но тем не менее:
V595 The ‘clp’ pointer was utilized before it was verified against nullptr. Check lines: 145, 150. clnt_raw.c 145
Рядом в этом файле можно увидеть аналогичный дефект: V595 The ‘clp’ pointer was utilized before it was verified against nullptr. Check lines: 232, 235. clnt_raw.c 232
Другой пример опасного кода:
V595 The ‘h_errnop’ pointer was utilized before it was verified against nullptr. Check lines: 146, 172. getnssent_r.c 146
Опасная оптимизация (уязвимость)
V597 The compiler could delete the ‘memset’ function call, which is used to flush ‘temp_result’ buffer. The RtlSecureZeroMemory() function should be used to erase the private data. sha256-crypt.c 385
Компилятор вправе удалить вызов функции memset() при компиляции Release версии. Точнее он не только в праве, но и обязан это сделать с целью оптимизации. Буфер ‘temp_result’ после вызова функции memset() нигде не используется, следовательно и сам вызов функции тоже лишний.
Мы имеем дело с уязвимостью, так как не будут очищены приватные данные. Следует заменить функцию memset() на более подходящую. Анализатор предлагает RtlSecureZeroMemory(), которой конечно нет в Linux. Но есть аналоги.
Аналогичная ситуация: V597 The compiler could delete the ‘memset’ function call, which is used to flush ‘temp_result’ buffer. The RtlSecureZeroMemory() function should be used to erase the private data. sha512-crypt.c 396
Undefined behavior
Казалось бы, библиотека glibc должна быть написана максимально переносимо. Однако мы встречаем в ней немало конструкций сдвига, которые нельзя назвать безопасными с точки зрения переносимости.
Вот что нам говорит стандарт языка Си о сдвигах:
The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.
The result of E1 > E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2 pow E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
Из стандарта следует, что неправильно сдвигать отрицательные числа. Однако, это очень распространённая операция в библиотеке glibc.
Пример сдвига влево:
V610 Undefined behavior. Check the shift operator ‘ Ответы на вопросы
Glibc
Для получения инструкций по установке смотрите Раздел Установка Glibc-2.3.2 в Главе 6.
Официальный адрес пакета
Содержимое Glibc
Устанавливаемые программы: catchsegv, gencat, getconf, getent, glibcbug, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump и zic
Устанавливаемые библиотеки: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, libc.[a,so], libc_nonshared.a, libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so и libutil.[a,so]
Краткие описания
catchsegv может использоваться для слежения за состоянием стека, когда программа завершается из-за ошибки распределения памяти (segmentation fault).
gencat генерирует каталоги сообщений.
getconf выводит параметры системной конфигурации для переменных, зависящих от файловой системы.
getent получает записи из административных баз данных.
glibcbug cсоздает отчет об ошибке и отсылает его по указанномы адресу.
iconv обеспечивает преобразование кодировки.
iconvconfig создает файл конфигурации для модуля iconv.
ldconfig настраивает временные привязки динамического компоновщика.
ldd возвращает список разделяемых библиотек, требующихся для указанной программы или библиотеки.
lddlibc4 используется ldd для объектных файлов.
localedef компилирует спецификации локали.
nscd_nischeck проверяет необходимость защищенного или простого запроса к NIS+.
rpcgen генерирует код C для реализации протокола RPC.
rpcinfo создает RPC вызов на сервер RPC.
sln используется для создания символических ссылок. Программа скомпонована статически, так что она используется для создания символических ссылок на динамические библиотеки если система динамической компоновки по каким-либо причинам нефункциональна.
sprof читает и отображает профильные данные распределяемого объекта.
tzselect спрашивает пользователя о его местонахождении и возвращает описание соответствующей временной зоны.
xtrace трассирует выполнение программы печатая исполняемую в данный момент функцию.
zdump делает дамп временной зоны.
libBrokenLocale используется программами, такими как Mozilla, для использования поврежденных локалей.
libSegFault обрабатывает ошибки распределения памяти (segmentation fault). Она пытается их перехватить.
libmcheck содержит код запуска при загрузке.
libmemusage используется memusage для сбора информации о памяти, используемой программой.
libpcprofile содержит профили функций, используемых для отслеживания времени, затрациваемого процессором на выполнения строк кода.
libresolv содержит функции для создания, отправки и интерпритации пакетов серверов доменных имен (DNS) Internet.
librpcsvc содержит функции, обеспецивающие различные сервисы RPC.
librt содержит функции, обеспечивающие большинство интерфейсов, описанных в POSIX.1b Realtime Extension.
libthread_db содержит функции, используюшиеся для сборки отладчиков для многопоточных приложений.
libutil содержит код «стандартных» функций, использующихся во многих утилитах Unix.
Зависимости установки Glibc
Glibc зависит от: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed, Texinfo.
Таблица соответствия GCC версий и libc в них
Есть версия GCC в нутри нее есть libc. Мне нужно знать соответстие версий обоих. Нужно типа такого: gcc 4.8 = glibc 2.5.3, gcc 5.2 = glibc 2.6.0
На сколько я помню, каждый релиз gcc содержит указание необходимых версий.
Мне нужно зная нужную версию glibc скачать gcc соответствующий ему
Какая версия glibc у вас?
Там точно не равно, а какой-то диапазон.
конкретная версия gcc может работать с разными версиями glibc
Например, вот PPA для Ubuntu 12.04, там есть gcc 11.1: https://launchpad.net/
Значит gcc 11.1 может работать как минимум от glibc2.15 до glibc2.34
Вот тут тестировали с glibc2.11
Так что gcc 11 может работать и с glibc2.11
Может и меньше возможно…
Какую gcc мне нужно установить, чтобы у нее по дефолту была 2.12.2 glibc?
Если ты будешь собирать на системе на которой glibc 2.12.2, то скорее всего любую.
Если ты будешь собирать на современном рабочем компьютере, то можешь запустить в докере систему с glibc 2.12.2 и там собрать любой gcc. Или установить из пакетного менеджера тот gcc, который шёл в той системе по умолчанию, если не нужно новые возможности С++
Если ты хочешь собирать на современном рабочем компьютере и не использовать докер, то поразбирайся тут: https://stackoverflow.com/questions/2856438/how-can-i-link-to-a-specific-glibc-version
Как мне перенастроить gcc под версию 2.12.2? Что нужно установить и как? беру образ докера gcc:4.8 ставл., и получаю segfault при вызове ldd.
Сейчас на моем железе работает исправно Ubuntu 12.04, у нее по умолчанию 2.15. Как мне переориентировать на 2.12?
Сейчас на моем железе работает исправно Ubuntu 12.04, у нее по умолчанию 2.15. Как мне переориентировать на 2.12?
Есть версия GCC в нутри нее есть libc
GCC можно скомпилировать с какой угодно версией Glibc. Например в репозитории SLES 11 доступен GCC 9. А версия GCC 10 доступна, если немного поработать напильником.
GCC можно скомпилировать с какой угодно версией Glibc
Не совсем, есть диапазоны совместимости. GCC 2.95, например, с современной glibc не соберется.