Введение

Стандартная библиотека C проекта GNU Библиотека стандарта C GNU, обычно известная как glibc, является реализацией проекта GNU стандартной библиотеки C. Она представляет собой надстройку над системными вызовами ядра Linux для использования приложениями. Несмотря на своё название, теперь она также напрямую поддерживает C++ (и, косвенно, другие языки программирования). Разработка glibc началась в 1980-х годах в Фонде свободного программного обеспечения (FSF) для операционной системы GNU. glibc – свободное программное обеспечение, распространяемое под лицензией GNU Lesser General Public License. | 2.30 Август 2019 года Unicode 12.1.0, динамический компоновщик принимает аргумент preload для предварительной загрузки разделяемых объектов, функция gettid добавлена в Linux, поддержка календаря Minguo (Китайская Республика), новая японская эра добавлена в локаль ja_JP, функции выделения памяти завершаются неудачей, если общий размер объекта превышает PTRDIFF_MAX; исправлено | 2.31 Февраль 2020 года Начальная поддержка стандарта C23 | 2.32 Август 2020 года Unicode 13.0, атрибут 'access' для улучшения предупреждений в GCC 10, т.е. для "помощи в обнаружении переполнения буфера и других выходов за границы допустимого диапазона" | 2.33 Февраль 2021 года HWCAPS | 2.34 Август 2021 года libpthread, libdl, libutil, libanl были интегрированы в libc | 2.35 Февраль 2022 года Unicode 14.0, локаль C.UTF-8, возобновляемые последовательности. Удалена поддержка Intel MPX | 2.36 Август 2022 года | 2.37 Февраль 2023 года | 2.38 Август 2023 года Добавлены функции strlcpy и strlcat. Поддержка libmvec для ARM64 | 2.39 Январь 2024 года Добавлен заголовочный файл stdbit.h из ISO C2X. Поддержка теневых стеков на x86-64, новые функции безопасности и удаление libcrypt. |

Проект glibc был первоначально написан в основном Роландом Макгратом, работавшим в Фонде свободного программного обеспечения (FSF) летом 1987 года, будучи подростком. В феврале 1988 года FSF описала glibc как почти завершившую функциональность, требуемую стандартом ANSI C. К 1992 году в ней были реализованы функции ANSI C 1989 и POSIX.1 1990, и велась работа над POSIX.2. В сентябре 1995 года Ульрих Дреппер сделал свой первый вклад в glibc, и к 1997 году большинство изменений вносил он. Дреппер занимал должность сопровождающего в течение многих лет и до 2012 года накопил 63% всех изменений в проекте. В мае 2009 года glibc была перенесена в репозиторий Git. В 2014 году glibc столкнулась с ошибкой нарушения ABI на s390. В июле 2017 года, через 30 лет после начала разработки glibc, Роланд Макграт объявил о своём уходе, "объявив себя почётным сопровождающим и отказавшись от непосредственного участия в проекте. Последние несколько месяцев, если не лет, показали, что вы больше не нуждаетесь во мне". В 2021 году требование о передаче авторских прав Фонду свободного программного обеспечения было отменено для проекта.

Вилка и вариант

В 1994 году разработчики ядра Linux создали форк glibc. Этот форк, "Linux libc", поддерживался отдельно до примерно 1998 года. Из-за недостаточной информации об авторских правах изменения не могли быть возвращены в GNU Libc. Когда FSF выпустила glibc 2.0 в январе 1997 года, разработчики ядра прекратили поддержку Linux libc из-за более полного соответствия glibc 2.0 стандартам POSIX. glibc 2.0 также предлагала улучшенную интернационализацию и более глубокую локализацию, поддержку IPv6, 64-битный доступ к данным, средства для многопоточных приложений, совместимость с будущими версиями, а код был более переносимым. Последняя использовавшаяся версия Linux libc имела внутреннее имя (soname). После этого glibc 2.x на Linux использует soname.

В 2009 году Debian и ряд производных дистрибутивов перешли с glibc на вариант eglibc. Eglibc поддерживалась консорциумом, в который входили Freescale, MIPS, MontaVista и Wind River. Она содержала изменения, которые делали её более подходящей для встраиваемых систем, и добавила поддержку архитектур, не поддерживаемых glibc, таких как PowerPC e500. Код eglibc был возвращен в glibc в версии 2.20. С 2014 года разработка eglibc прекращена. Проект Yocto и Debian также вернулись к glibc после выпуска Debian Jessie.

Руководящий комитет

Начиная с 2001 года, развитие библиотеки находилось под надзором комитета, при этом Ульрих Дреппер оставался ведущим разработчиком и сопровождающим. Создание руководящего комитета сопровождалось общественными разногласиями, поскольку Ульрих Дреппер открыто назвал это неудачной попыткой враждебного захвата, предпринятой Ричардом Сталлманом. В марте 2012 года руководящий комитет проголосовал за самороспуск и отстранение Дреппера в пользу процесса разработки, управляемого сообществом, где Райан Арнольд, Максим Кувирков, Джозеф Майерс, Карлос О’Донелл и Александр Олива взяли на себя ответственность за поддержку GNU (но без дополнительных полномочий по принятию решений).

Функциональность

glibc предоставляет функциональность, необходимую в соответствии с Единой спецификацией UNIX, POSIX (1c, 1d и 1j), а также часть функциональности, требуемой стандартами ISO C11, ISO C99, интерфейсами Berkeley Unix (BSD), Определением интерфейса System V (SVID) и Руководством по переносимости X/Open (XPG), выпуск 4.2, со всеми расширениями, общими для систем, соответствующих XSI (X/Open System Interface), и всеми расширениями X/Open UNIX. Помимо этого, glibc предоставляет расширения, которые были признаны полезными или необходимыми в процессе разработки GNU.

Поддерживаемые аппаратные средства и ядра

glibc используется в системах, работающих с различными ядрами и аппаратными архитектурами. Наиболее часто он применяется в системах с ядром Linux на аппаратном обеспечении x86, однако официально поддерживаемое оборудование включает: ARM, ARC, C SKY, DEC Alpha, IA 64, Motorola m68k, MicroBlaze, MIPS, Nios II, PA RISC, PowerPC, RISC V, s390, SPARC и x86 (старые версии поддерживают TILE). Официально поддерживаются ядра Hurd и Linux. Кроме того, существуют значительно модифицированные версии, работающие на ядрах FreeBSD и NetBSD (на основе которых построены системы Debian GNU/kFreeBSD и Debian GNU/NetBSD соответственно), а также ответвлённая версия OpenSolaris. Он также используется (в изменённом виде) и упоминается в BeOS и Haiku.

Использование в небольших устройствах

glibc критиковалась за свою "раздутость" и более низкую скорость по сравнению с другими библиотеками, например, Линусом Торвальдсом и программистами, работающими со встраиваемыми системами Linux. По этой причине было создано несколько альтернативных библиотек стандартной библиотеки C, делающих акцент на меньший размер. Однако многие проекты для небольших устройств предпочитают GNU libc более компактным альтернативам из-за широкой поддержки приложений, соответствия стандартам и полноты функциональности. Примеры включают Openmoko и Familiar Linux для портативных устройств iPaq (при использовании программного обеспечения GPE).

Функции защищенной строки

glibc не реализует интерфейсы проверки границ, определённые в C11, и не реализовала функции strlcpy и strlcat до 2023 года, мотивируя это тем, что "на практике эти функции могут создавать проблемы, поскольку их предполагаемое использование способствует скрытой обрезке данных, усложняет код и снижает его эффективность, а также не предотвращает все переполнения буфера в целевых буферах". В разделе часто задаваемых вопросов отмечалось, что интерфейсы проверки границ являются необязательными в стандарте ISO и что в качестве альтернативы доступна функция snprintf.

Слои совместимости

Существуют слои совместимости ("shims"), позволяющие программам, написанным для других экосистем, работать в системах, использующих интерфейс glibc. К ним относятся libhybris — слой совместимости для Android Bionic, и Wine, который можно рассматривать как слой совместимости, преобразующий API Windows в glibc и другие нативные API, доступные в Unix-подобных системах.