Какую версию библиотеки C моя система использует?

Создайте представление только для чтения того каталога в другом месте. Можно сделать это с bindfs.

Скажем, то, что рассматриваемый каталог /home/confidential/reboot и это Вы хотите дать доступ только для чтения пользователям в группе mygroup. Создайте каталог /views/mygroup/reboot который доступен для той группы.

mkdir -p /views/mygroup/reboot
chown root:mygroup /views/mygroup
chmod 750 /views/mygroup

Создайте представление только для чтения с bindfs. Процесс bindfs должен иметь разрешение считать файлы и получить доступ к точке монтирования; здесь Вы, по-видимому, выполнили бы его как корень.

bindfs -p a-w /home/confidential/reboot /views/mygroup/reboot

Если файлы под /home/confidential/reboot не читаемы пользователями в mygroup и Вы хотите сделать их так, изменить спецификацию полномочий на -p a=rX.

Для создания представления только для чтения во время начальной загрузки добавьте его к /etc/fstab:

bindfs#/home/confidential/reboot /views/mygroup/reboot fuse perms=a=rX

43
19.03.2014, 18:59
6 ответов

GNU/Linux системы[116653] обычно используют либо glibc (семейство Fedora/Redhat, Arch), либо его двоюродного брата, eglibc (семейство Debian/Ubuntu); так как eglibc в настоящее время сливается обратно в glibc ([116654]см. [116965]EGLIBC 2. 19 Branch Created[116966] в разделе "News"[116655]), в ближайшем будущем все они снова будут glibc.

Самый простой способ проверить точную версию - это спросить [116656]ldd[116657], которая поставляется с библиотекой C.

На Fedora 20:

alt text

Это glibc 2.18.

На Raspbian (перенос Debian 7 на ARMv6 Broadcom SoC):

  • Это eglibc 2.13.
  • Если по каким-либо причинам вы перепутали и сравнили некоторые части или не уверены в [116658]ldd[116659], вы можете запросить библиотеку Си напрямую.
  • Ни одна из них не является исполняемой, но они дают подсказку, где ее найти.
  • Однако, это не обязательно так просто, так как Си-библиотека не должна находиться где-то [116660]где ее можно найти[116661].

К сожалению, man-страница не предоставляет номер версии. [116662]ldd[116663] по-прежнему пригодится, так как любой работающий, динамически компонованный исполняемый файл на системе (например, почти все в [116664]/usr/bin[116665]) будет компоноваться с библиотекой Си.

libc.so.6[116667] находится в третьей строке.

50
27.01.2020, 19:35
[117301] Очевидным ответом, хотя и не самым полным, является проверка вашего менеджера пакетов, например,[12108](К сожалению, glibc не имеет файла pkconfig [117637].pc[117638], поэтому [117639]pkgconfig --modversion glibc[117640] не является бегущей строкой)). Смотрите также отличное предложение Gnouc [117641]getconf[117642].[12109]Самый простой случай, с gcc+glibc, и тот, который я в основном использую первым, это просто выполнить [117643]libc.so[117644], как описано в некоторых других ответах здесь. Нет необходимости передавать какие-либо аргументы, он выводит свою версию по умолчанию. Это работает вплоть до glibc-2.1 (glibc-2.0 seg-faults, хотя в те времена можно было проверить (теперь выбывший) скрипт [117645]glibcbug[117646], чтобы подтвердить версию). Этот метод также работает с недавними (>0.9.15) версиями [117647]musl-libc[117648] (которые только что вышли 1.0 сегодня, 20 марта). Он не работает с uClibc, он segfaults.[12110]Один простой способ точно сказать, что ваш [117649]gcc[117650] собирается сделать, это скомпилировать:[12111](с glibc, [117651][117652] включает в себя [117653]<функции. h>[117654], который определяет соответствующие макросы GLIBC, вам нужно [117655][117656] для деклараций функций.)[12112]Это ловит более сложные случаи (несколько libc, и/или несколько компиляторов), предполагая, что вы используете правильный компилятор (и флаги), конечно же. (Однако я подозреваю, что это не будет различать между собственно glibc и glibc.) [12113]Если вы уверены, что используете glibc (или eglibc), то [117865]ld[117866] также подтвердит версию [117658] (извините, это неправильно). [12114]Если [117659]__GNU_LIBRARY__[117660] не определено, то вы получите ошибки, тогда может помочь план Б.[12115]gcc -dumpmachine[117662], например, для uclibc имеется суффикс [117663]-uclibc[117664], также как и [117665]gcc -dumpspecs | grep dynamic-linker[117666]. Это также может означать ABI.[12116]gcc -print-file-name=libc.so[117668] скажет вам, какой файл компилятор будет использовать для "[117669]-lc[117670]", это почти наверняка компоновщик-скрипт в вашей установке gcc, который вы можете прочитать как обычный текст. Это покажет точный путь к [117671]-lc[117672]. Это также сработает, если вы передаете флаги типа [117673]-m32[117674] или [117675]-m64[117676]. [12117] В случае использования [117677]uclibc[117678] (как используется OpenWRT и более), он определяет [117679]__UCLIBC_MAJOR__[117680], [117681]__UCLIBC_MINOR__[117682] и [117683]__UCLIBC_SUBLEVEL__[117684], а также [117685]__UCLIBC__[117686] в [117687]<функции. h>[117688], так что это легко обнаруживается с помощью небольшого вариации на приведенном выше фрагменте кода на Си. В интересах совместимости uClibc может также определить макросы GNU/GLIBC в том виде, в каком они использовались выше, в настоящее время она претендует на glibc-2.2. В настоящее время она не реализует функции [117689]gnu_get_libc_X()[117690], но она [117691]реализует [117693]getconf[117694], что также может ввести в заблуждение (я подозреваю, что она возвращает пустой ответ для [117695]getconf GNU_LIBC_VERSION[117696], моя зависть к сборке дуется сегодня, так что я не могу подтвердить. )[12118]В маловероятном случае, если вы используете [117697]dietlibc[117698], запуск [117699]diet -v[117700] отобразит версию.[12119](FWIW, за несколько лет с программным обеспечением, использующим autoconf, у меня было больше проблем с непроверенными для [117701]gcc[117702] и [117703]g++[117704] требованиями, чем с непроверенными для glibc возможностями.)[117326].
10
27.01.2020, 19:35
[117150](Это по существу тот же ответ, что и у Златовласки, но с некоторым дополнительным объяснением того, что происходит под капотом)

Основная разделяемая библиотека для GNU libc, [117458]libc.so.6[117459] (под Linux; у Hurd другое SONAME), имеет необычное свойство (для разделяемых библиотек), на которое вы можете ссылаться, как на исполняемый файл. Если вы это сделаете, он распечатает то, что утилиты GNU обычно печатают при запуске с [117460]--версией[117461], например:

  • Но, конечно, каталог, в котором [117462]libc.so.6[117463] живет, не находится в [117464]$PATH[117465], так что вы должны знать, где его искать. Это может быть [117466]/lib[117467], [117468]/lib64[117469], [117470]/usr/lib[117471], или что-то еще более странное (как в данном случае). Удобно, что [117472]ldd[117473] скажет вам:
  • Для того, чтобы это сработало, конечно, вы должны знать полное имя динамически связанного бинарного исполняемого файла. Исполняемый файл [117474]sh[117475] гарантированно находится в [117476]/bin[117477] (потому что так много скриптов [117478]#![117479] ожидают этого), и сам по себе он не может быть [117480]#![117481] скриптом. Он [117482] может быть [117483] статически связан, но я не сталкивался с системой, которая делала бы это много лет.
  • Я не знаю, что вы делаете, если вы работаете с uClibc или мускулом, или чем-то более экзотическим.[117159].
5
27.01.2020, 19:35
[116389] GNU libc (то, что большинство дистрибутивов Linux используют в той или иной форме) делает все возможное, чтобы сохранить строгую обратную совместимость. Поэтому вы должны столкнуться с проблемами, только если попытаетесь запустить новый двоичный файл на старой версии (или "корпоративный" дистрибутив, они обычно замораживают версии, особенно базовые, такие как библиотека Си, сохраняя при этом жесткую бинарную совместимость). Я считаю, что вы гораздо чаще сталкиваетесь с проблемами с другими библиотеками (в памяти Си++ было несколько изменений API/ABI, некоторые другие библиотеки просто [116763] не заботятся об обратной совместимости).[12193]К сожалению, единственный способ узнать наверняка - это попробовать.[116392].
5
27.01.2020, 19:35
[119769]Другой способ получить его:

5
27.01.2020, 19:35
[117104]На самом деле система не ограничена одной библиотекой Си. Большинство, однако, в основном используют только одну, которая также будет использоваться компилятором по умолчанию. А так как вы загружаете исходные тексты для компиляции, то это тот, который вас интересует.

date --set="23 June 1988 10:00:00"
date --set="10:00:00"
Начните с тривиальной программы:

скомпилируйте ее, используя компилятор, который вы собираетесь использовать для компиляции исходных текстов, затем воспользуйтесь [117430]ldd[117431], чтобы узнать, где находится библиотека Си:

Теперь у вас есть путь к библиотеке Си. Вы можете найти его в менеджере пакетов (например, [117432]dpkg -S /lib/x86_64-linux-gnu/libc.so.6[117433] или [117434]rpm -q -f /lib/x86_64-linux-gnu/libc.so.6. [117435]).

По крайней мере, в случае с eglibc/glibc, вы можете запустить его:

Наконец, вы можете получить подсказки из [117436]objdump -p /lib/x86_64-linux-gnu/libc.so.6. [117437], заглянув в раздел определений версий [117438][117439]:

Обратите внимание на то, что символ GLIBC_2.18 имеет самый последний номер версии среди перечисленных символов, а версия библиотеки действительно 2.18. Однако, это elibc (она стремится быть бинарно совместимой с glibc 2.18, поэтому она использует те же самые версии символов).

ffmpeg -i in.mp4 out.mp3
Вы также можете попытаться использовать [117440]строки[117441], чтобы узнать что-нибудь об этом. Вы захотите указать более длинную минимальную длину ([117442]-n[117443]), или использовать grep для поиска:

обе эти строки работают для этого eglibc.

ПРИМЕЧАНИЕ: Утилита пакета Debian [117444]dpkg-shlibdeps[117445] использует [117446]objdump[117447] под капотом, вместе с информацией о сохранённых символах в пакетах библиотек Debian, для определения минимальных версий зависимостей, требуемых двоичными пакетами Debian во время сборки. В основном, он смотрит на символы, экспортируемые двоичным пакетом Debian, а затем находит минимальные версии библиотек, которые содержат эти символы.[117123].

14
27.01.2020, 19:35

Теги

Похожие вопросы