Какая разница между Glibc и Libc ?
Какая разница между Glibc и libc — имеется в виду приимущества и недостатки одной и другой?
anonymous
31.05.99 00:00:00 MSD
Re: Какая разница между Glibc и Libc ?
В glibc много дополнительных «вкусностей» вроде функций типа g_strdup_printf или же g_strndup, которых нет в libc, ещё также новые Midnigth Commander используют эту библиотеку.
anonymous
( 31.05.99 00:00:00 MSD )

Re: Какая разница между Glibc и Libc ?
Не надо путать glibc и glib. Оригинальный вопрос был о разнице между libc и glibc. Суть в том, что это просто разные стадии в развитии GNU C Library. Также как сейчас используются две серии ядер Linux 2.0 и 2.2, также и существуют две (а можно сказать и три) Си библиотеки. glibc довольно сильно ушла вперед по развитию, она содержит много новых фич, лучше поддерживает разные стандарты. libc — старая, более простая, проверенная версия. Переход на glibc неизбежен, но, например Slackware до сих пор строится на libc.
Библиотека glib это вобще не отсюда — это библиотека различных полезных функций, созданная при разработке GIMP, и использующаяся (и развивающаяся) в рамках проекта Gnome.
maxcom ★★★★★
( 31.05.99 00:00:00 MSD )
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Ошибка при компиляции Glibc (2015)
- Форум libc (2001)
- Форум в каких версиях libc имеется strlcpy/strlcat (2017)
- Форум Таблица соответствия GCC версий и libc в них (2021)
- Форум Как узнать версию glibc ? (2000)
- Форум Port from Linux to FreeBSD (libc/glibc differences) (2001)
- Новости glibc 2.1.2 (1999)
- Форум Q2->SDL->libc->. (2003)
- Форум Q2->SDL->libc->. (2003)
- Форум Q2->SDL->libc->. (2003)
Glibc
Для получения инструкций по установке смотрите Раздел Установка Glibc-2.3.2 в Главе 6.
Официальный адрес пакета
Содержимое Glibc
Glibc — это библиотека C, которая обеспечивает системные вызовы и основные функции, такие как open, malloc, printf и другие. Библиотеку C используют все динамически скомпонованые программы.
Устанавливаемые программы: 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 для объектных файлов.
locale — программа на Perl, которая указывает компилятору использовать или нет локали POSIX для встроеных операций.
localedef компилирует спецификации локали.
nscd — имя демона сервиса кеширования, предоставляющий кеш для большинства запросов DNS.
nscd_nischeck проверяет необходимость защищенного или простого запроса к NIS+.
pcprofiledump — делает дамп информации, генерируемой профилем PC.
pt_chown — вспомогательная программа для grantpt. Устанавливает владельца, группу и права доступа дополнительного терминала pseudo.
rpcgen генерирует код C для реализации протокола RPC.
rpcinfo создает RPC вызов на сервер RPC.
sln используется для создания символических ссылок. Программа скомпонована статически, так что она используется для создания символических ссылок на динамические библиотеки если система динамической компоновки по каким-либо причинам нефункциональна.
sprof читает и отображает профильные данные распределяемого объекта.
tzselect спрашивает пользователя о его местонахождении и возвращает описание соответствующей временной зоны.
xtrace трассирует выполнение программы печатая исполняемую в данный момент функцию.
zdump делает дамп временной зоны.
zic — компилятор временных зон.
ld.so — вспомогательная программа для исполняемых файлов распределяемых библиотек.
libBrokenLocale используется программами, такими как Mozilla, для использования поврежденных локалей.
libSegFault обрабатывает ошибки распределения памяти (segmentation fault). Она пытается их перехватить.
libanl — библиотека асинхронных запросов DNS.
libbsd-compat — поддерживает портируемость, необходимую для запуска некоторых BSD программ под Linux.
libc — главная библиотека C — набор часто используемых функций.
libcrypt — криптографическая библиотека.
libdl — библиотека интерфейса динамического подключения.
libg — библиотека времени выполнения для g++.
libieee — библиотека IEEE для операцией с числами с плавающей запятой.
libm — математическая библиотека.
libmcheck содержит код запуска при загрузке.
libmemusage используется memusage для сбора информации о памяти, используемой программой.
libnsl — библиотека сетевых сервисов.
libnss* — библиотеки Name Service Switch, содержащие функции для работы с именами хостов, пользователей и групп, псевдонимами, сервисами, протоколами и всем чем можно.
libpcprofile содержит профили функций, используемых для отслеживания времени, затрациваемого процессором на выполнения строк кода.
libpthread — библиотека потоков POSIX.
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.
| Назад | В начало | Далее |
| Gettext | Наверх | Grep |
Libc что это
Термин «libc» обычно используется как сокращение обозначения «стандартной библиотеки C» — библиотеки стандартных функций, которые могут использоваться всеми программами, написанными на C (и, иногда, программами, написанными на других языках). Из-за некоторых исторических событий (см. ниже), использование термина «libc» как обозначение стандартной библиотеки С в Linux, несколько некорректно.
glibc
Вне всяких сомнений, наиболее широко используемой в Linux библиотекой C является библиотека GNU C (http://wwwgnuorg/software/libc/) часто упоминаемая как glibc. В настоящее время данная библиотека используется во всех основных дистрибутивах Linux. Также эта библиотека описана в соответствующих справочных страницах проекта man-pages (в основном, в разделе 3). Документация к glibc также доступна в руководстве glibc, доступном по команде info libc. Выпуск 1.0 glibc состоялся в сентябре 1992 года (до этого было несколько выпусков 0.x). Следующий большой выпуск glibc версии 2.0 состоялся в начале 1997 года. Путь /lib/libc.so.6 (или подобный), обычно является символической ссылкой на расположение библиотеки glibc, а выполнение этого пути приводит к отображению различной информации о glibc, установленной в системе.
Linux libc
В первой половине 1990х годов какое-то время существовала Linux libc, ответвление glibc 1.x, созданное разработчиками Linux, которые были не удовлетворены ходом разработки glibc для Linux. Часто, эту библиотеку называли (необоснованно) просто «libc». Было несколько основных версий Linux libc — 2, 3, 4 и 5 (а также много промежуточных). Некоторое время Linux libc была стандартной библиотекой Си во многих дистрибутивах Linux. Однако, несмотря на всю первоначальную заинтересованность в разработке Linux libc, к этому времени была выпущена glibc 2.0 (в 1997 году), которая была однозначно лучше Linux libc, и все основные дистрибутивы Linux, которые использовали Linux libc, скоро переключились обратно на glibc. Так как этот переход произошёл давно, в man-pages Linux libc больше не описывается. Тем не менее упоминание о Linux libc сохранилось в некоторых справочных страницах под именами libc4 и libc5.
Другие библиотеки C
Существует несколько других менее распространённых библиотек C для Linux Эти библиотеки, обычно, меньше glibc, как по возможностям так и по потреблению памяти, и часто предназначены для сборки исполняемых файлов малого размера, используемых, в основном, для разработки встраиваемых систем Linux. Такими библиотеками являются uClibc dietlibc и musl libc Описание этих библиотек охватывается проектом man-pages, если что-то известно.
История двух стандартных библиотек Си
Сегодня мне пришел баг-репорт от пользователя Debian, который скормил какую-то ерунду в утилиту scdoc и получил SIGSEGV . Исследование проблемы позволило мне провести отличное сравнение между musl libc и glibc . Для начала посмотрим на стектрейс:
==26267==ERROR: AddressSanitizer: SEGV on unknown address 0x7f9925764184 (pc 0x0000004c5d4d bp 0x000000000002 sp 0x7ffe7f8574d0 T0) ==26267==The signal is caused by a READ memory access. 0 0x4c5d4d in parse_text /scdoc/src/main.c:223:61 1 0x4c476c in parse_document /scdoc/src/main.c 2 0x4c3544 in main /scdoc/src/main.c:763:2 3 0x7f99252ab0b2 in __libc_start_main /build/glibc-YYA7BZ/glibc-2.31/csu/../csu/libc-start.c:308:16 4 0x41b3fd in _start (/scdoc/scdoc+0x41b3fd)
В исходниках на данной строчке написано вот что:
if (!isalnum(last) || ((p->flags & FORMAT_UNDERLINE) && !isalnum(next)))
Подсказка: p — это корректный, ненулевой указатель. Переменные last и next имеют тип uint32_t . Сегфолт случается на втором вызове функции isalnum . И, самое важное: воспроизводится только при использовании glibc, но не musl libc. Если вам пришлось перечитать код несколько раз, вы не одиноки: тут попросту нечему вызывать сегфолт.
Поскольку было известно, что все дело в библиотеке glibc, я достал ее исходники и стал искать реализацию isalnum , готовясь столкнуться с какой-нибудь дурацкой фигней. Но прежде чем я дойду до дурацкой фигни, которой там, уж поверьте, навалом, давайте сначала быстренько поглядим на хороший вариант. Вот так функция isalnum реализована в musl libc:
int isalnum(int c) < return isalpha(c) || isdigit(c); >int isalpha(int c) < return ((unsigned)c|32)-'a' < 26; >int isdigit(int c)
Как и ожидалось, для любого значения c функция отработает без сегфолта, потому что с какого хрена вообще isalnum должна кидать сегфолт?
Ладно, теперь сравним это с реализацией glibc. Как только вы откроете заголовок, вас будет встречать типичная GNU'шная галиматья, но пропустим ее и попытаемся найти isalnum .
Первый результат такой:
enum < _ISupper = _ISbit (0), /* UPPERCASE. */ _ISlower = _ISbit (1), /* lowercase. */ // . _ISalnum = _ISbit (11) /* Alphanumeric. */ >;
Похоже на деталь реализации, двигаемся дальше.
__exctype (isalnum);
Но что такое __exctype ? Возвращаемся на несколько строчек вверх…
#define __exctype(name) extern int name (int) __THROW
Ладно, по всей видимости это только прототип. Непонятно правда, зачем тут нужен макрос. Ищем дальше…
#if !defined __NO_CTYPE # ifdef __isctype_f __isctype_f (alnum) // .
Так, вот это уже похоже на что-то полезное. Что такое __isctype_f ? Мотаем вверх…
#ifndef __cplusplus # define __isctype(c, type) \ ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type) #elif defined __USE_EXTERN_INLINES # define __isctype_f(type) \ __extern_inline int \ is##type (int __c) __THROW \ < \ return (*__ctype_b_loc ())[(int) (__c)] & (unsigned short int) _IS##type; \ >#endif
Ну начинается… Ладно, вместе как-нибудь разберемся. Видимо, __isctype_f — это инлайн-функция… стоп, это все находится внутри блока else препроцессорной инструкции #ifndef __cplusplus. Тупик. Где же isalnum , мать ее, на самом деле определена? Ищем дальше… Может вот оно?
#if !defined __NO_CTYPE # ifdef __isctype_f __isctype_f (alnum) // . # elif defined __isctype # define isalnum(c) __isctype((c), _ISalnum) //
Эй, это же «деталь реализации», которую мы видели раньше. Помните?
enum < _ISupper = _ISbit (0), /* UPPERCASE. */ _ISlower = _ISbit (1), /* lowercase. */ // . _ISalnum = _ISbit (11) /* Alphanumeric. */ >;
Попробуем по-быстрому расковырять этот макрос:
# include # if __BYTE_ORDER == __BIG_ENDIAN # define _ISbit(bit) (1 > 8)) # endif
Ну что за фигня? Ладно, двигаем дальше и считаем, что это просто магическая константа. Другой макрос называется __isctype , который похож на недавно виденный нами __isctype_f . Посмотрим еще разок на ветку #ifndef __cplusplus :
#ifndef __cplusplus # define __isctype(c, type) \ ((*__ctype_b_loc ())[(int) (c)] & (unsigned short int) type) #elif defined __USE_EXTERN_INLINES // . #endif
Ну, по крайней мере мы нашли разыменовывание указателя, которое могло бы объяснить сегфолт. А что такое __ctype_b_loc ?
/* Эти объявления находятся в файле ctype-info.c. Они должны совпадать с объявлениями в файле localeinfo.h. В модели локалей, основывающейся на потоках, (см. `uselocale' в ) мы не можем пользоваться глобальными переменными, как раньше. Вместо этого, ниже указаны функции-аксессоры, которые возвращают адрес каждой переменной, относящейся к текущему потоку, если потоков несколько. Они указывают на массивы из 384 элементов, поэтому для индексации можно использовать значение `unsigned char' [0,255]; а также EOF (-1); или любое значение `signed char' value [-128,-1). ISO C требует, чтобы функции ctype работали со значениями типа `unsigned char' и EOF; мы также поддерживаем отрицательные значения `signed char' для совместимости со старыми некорректными программами. Массивы для конвертации регистра содержат значения типа `int`, а не `unsigned char`, потому что `tolower(EOF)' должно возвращать EOF, а это значение не помещается в диапазон `unsigned char`. Однако сейчас самое важное - то, что эти массивы также используются для многобайтовых кодировок. */ extern const unsigned short int **__ctype_b_loc (void) __THROW __attribute__ ((__const__)); extern const __int32_t **__ctype_tolower_loc (void) __THROW __attribute__ ((__const__)); extern const __int32_t **__ctype_toupper_loc (void) __THROW __attribute__ ((__const__));
Как круто с твоей стороны, glibc! Я просто обожаю иметь дело с локалями. Так или иначе, к моему упавшему приложению подключен gdb, и держа в уме всю полученную информацию я пишу вот это убожество:
(gdb) print ((unsigned int **(*)(void))__ctype_b_loc)()[next] Cannot access memory at address 0x11dfa68
Сегфолт найден. В комменте была про это строчка: «ISO C требует, чтобы функции ctype работали со значениями типа `unsigned char' и EOF». Если найти это в спецификации, увидим:
Во всех реализациях [функций, объявленных в ctype.h], аргументом является int, значение которого должно помещаться в unsigned char, или же равняться значению макроса EOF.
Теперь становится очевидно, как исправить проблему. Мой косяк. Оказывается, я не могу скормить в isalnum произвольный символ UCS-32 для проверки на его вхождение в диапазоны 0x30-0x39, 0x41-0x5A и 0x61-0x7A.
Но тут я возьму на себя смелость предположить: а может быть, функция isalnum вообще не должна кидать сегфолт, вне зависимости от того, что ей передадут? Может быть, даже если спецификация это разрешает, это не означает, что так надо делать? Может быть, ну просто в качестве безумной идеи, поведение этой функции не должно содержать пять макросов, проверять использование компилятора C++, зависеть от порядка байтов вашей архитектуры, таблицы поиска, данных о локали потока и разыменовывать два указателя?
Еще разок посмотрим на версию в musl в качестве быстрого напоминания:
int isalnum(int c) < return isalpha(c) || isdigit(c); >int isalpha(int c) < return ((unsigned)c|32)-'a' < 26; >int isdigit(int c)
Вот такие пироги.
Примечание переводчика: спасибо MaxGraey за ссылку на оригинал.