Введение
Стандартная библиотека 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. |
The GNU C Library, commonly known as glibc, is the GNU Project's implementation of the C standard library. It is a wrapper around the system calls of the Linux kernel for application use. Despite its name, it now also directly supports C++ (and, indirectly, other programming languages). It was started in the 1980s by the Free Software Foundation (FSF) for the GNU operating system. glibc is free software released under the GNU Lesser General Public License. |
| 2.30 || August 2019 || Unicode 12.1.0, the dynamic linker accepts the preload argument to preload shared objects, the gettid function has been added on Linux, Minguo (Republic of China) calendar support, new Japanese era added to ja JP locale, memory allocation functions fail with total object size larger than PTRDIFF MAX; fixed
|
| 2.31 || February 2020 || Initial C23 standard support
|
| 2.32 || August 2020 || Unicode 13.0, 'access' attribute for better warnings in GCC 10, i. e. to "help detect buffer overflows and other out of bounds accesses"
|
| 2.33 || February 2021 || HWCAPS
|
| 2.34 || August 2021 || libpthread, libdl, libutil, libanl has been integrated into libc. |
| 2.35 || February 2022 || Unicode 14.0, C. UTF 8 locale, restartable sequences. Removed Intel MPX support. |
| 2.36 || August 2022 ||
|
| 2.37 || February 2023 ||
|
| 2.38 || August 2023 || The strlcpy and strlcat functions added. libmvec support for ARM64. |
| 2.39 || January 2024 || The stdbit. h header has been added from ISO C2X. Support for shadow stacks on x86 64, new security features, and the removal of libcrypt. |}
The glibc project was initially written mostly by Roland McGrath, working for the Free Software Foundation (FSF) in the summer of 1987 as a teenager. In February 1988, FSF described glibc as having nearly completed the functionality required by ANSI C. By 1992, it had the ANSI C 1989 and POSIX.1 1990 functions implemented and work was under way on POSIX.2. In September 1995 Ulrich Drepper made his first contribution to the glibc and by 1997 most commits were made by him. Drepper held the maintainership position for many years and until 2012 accumulated 63% of all commits to the project. In May 2009 glibc was migrated to a Git repository. In 2014, glibc suffered from an ABI breakage bug on s390. In July 2017, 30 years after he started glibc, Roland McGrath announced his departure, "declaring myself maintainer emeritus and withdrawing from direct involvement in the project. These past several months, if not the last few years, have proven that you don't need me anymore". In 2021, the copyright assignment requirement to the Free Software Foundation was removed from the project.
Проект 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 году требование о передаче авторских прав Фонду свободного программного обеспечения было отменено для проекта.
The GNU C Library, commonly known as glibc, is the GNU Project's implementation of the C standard library. It is a wrapper around the system calls of the Linux kernel for application use. Despite its name, it now also directly supports C++ (and, indirectly, other programming languages). It was started in the 1980s by the Free Software Foundation (FSF) for the GNU operating system. glibc is free software released under the GNU Lesser General Public License. |
| 2.30 || August 2019 || Unicode 12.1.0, the dynamic linker accepts the preload argument to preload shared objects, the gettid function has been added on Linux, Minguo (Republic of China) calendar support, new Japanese era added to ja JP locale, memory allocation functions fail with total object size larger than PTRDIFF MAX; fixed
|
| 2.31 || February 2020 || Initial C23 standard support
|
| 2.32 || August 2020 || Unicode 13.0, 'access' attribute for better warnings in GCC 10, i. e. to "help detect buffer overflows and other out of bounds accesses"
|
| 2.33 || February 2021 || HWCAPS
|
| 2.34 || August 2021 || libpthread, libdl, libutil, libanl has been integrated into libc. |
| 2.35 || February 2022 || Unicode 14.0, C. UTF 8 locale, restartable sequences. Removed Intel MPX support. |
| 2.36 || August 2022 ||
|
| 2.37 || February 2023 ||
|
| 2.38 || August 2023 || The strlcpy and strlcat functions added. libmvec support for ARM64. |
| 2.39 || January 2024 || The stdbit. h header has been added from ISO C2X. Support for shadow stacks on x86 64, new security features, and the removal of libcrypt. |}
The glibc project was initially written mostly by Roland McGrath, working for the Free Software Foundation (FSF) in the summer of 1987 as a teenager. In February 1988, FSF described glibc as having nearly completed the functionality required by ANSI C. By 1992, it had the ANSI C 1989 and POSIX.1 1990 functions implemented and work was under way on POSIX.2. In September 1995 Ulrich Drepper made his first contribution to the glibc and by 1997 most commits were made by him. Drepper held the maintainership position for many years and until 2012 accumulated 63% of all commits to the project. In May 2009 glibc was migrated to a Git repository. In 2014, glibc suffered from an ABI breakage bug on s390. In July 2017, 30 years after he started glibc, Roland McGrath announced his departure, "declaring myself maintainer emeritus and withdrawing from direct involvement in the project. These past several months, if not the last few years, have proven that you don't need me anymore". In 2021, the copyright assignment requirement to the Free Software Foundation was removed from the project.
Вилка и вариант
В 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-подобных системах.