Glibc
La biblioteca de C de GNU (del inglés GNU C library), comúnmente conocida como glibc es la biblioteca de tiempo de ejecución estándar del lenguaje C de GNU. Se distribuye bajo los términos de la licencia GNU LGPL.
GNU C Library | |||
---|---|---|---|
Parte de GNU toolchain | |||
Información general | |||
Tipo de programa | Biblioteca runtime | ||
Desarrollador | Proyecto GNU | ||
Lanzamiento inicial | 1987 | ||
Vulnerabilidades |
| ||
Licencia | GNU LGPL | ||
Estado actual | Activo | ||
Información técnica | |||
Programado en | C | ||
Versiones | |||
Última versión estable | 2.3831 de julio de 2023 | ||
Archivos legibles | |||
Time Zone Information Format | |||
Archivos editables | |||
Time Zone Information Format | |||
Enlaces | |||
En los sistemas en los que se usa, esta biblioteca de C que proporciona y define las llamadas al sistema y otras funciones básicas, es utilizada por casi todos los programas. Es muy usada en los sistemas GNU y sistemas basados en el núcleo Linux. Es muy portable y soporta gran cantidad de plataformas de hardware. En los sistemas Linux se instala con el nombre de libc6.
Hardware y núcleos soportados
Glibc es usada en sistemas que trabajan con muchos núcleos diferentes y diferentes arquitecturas de hardware. El uso más común es en sistemas con el núcleo Linux en hardware x86, pero también soporta oficialmente las siguientes plataformas de hardware: x86, Motorola 680x0, DEC Alpha, PowerPC, ARM, ETRAX CRIS, S/390 y SPARC. Tiene soporte oficial para núcleos Hurd y Linux, aunque hay disponibles versiones con muchos parches que funcionan con núcleos de FreeBSD y NetBSD (como es el caso de Debian GNU/kFreeBSD y Debian GNU/NetBSD, respectivamente). Es también usada (de una forma modificada) como la libroot de BeOS y por eso en Haiku.
Funcionalidad de GNU
La Glibc no solo provee funcionalidad según las especificaciones POSIX sino que también provee extensiones GNU a dicho estándar, de manera que las aplicaciones pueden ser escritas para POSIX o para GNU. Glibc también implementa heurísticas en tiempo de ejecución para la gestión de memoria.
La función malloc
puede tener una gran complejidad detrás de ella. No solo se limita a reservar la cantidad demandada de memoria dinámica en el montículo de memoria (heap) gestionado por el núcleo del sistema operativo. Glibc mantiene varios bloques de memoria dinámica que superan la capacidad demandada. Dichos bloques los administra a conveniencia sin necesidad de llamar continuamente al núcleo del sistema operativo.[1]
Otro ejemplo de heurísticas de tiempo de ejecución implementadas en Glibc consiste en la elección de la llamada a sistema que corresponda según arquitectura y versión de Linux.[2] Linux dispone de múltiples llamadas a sistema y no todas están disponibles para todas las arquitecturas. Además, para una misma especificación de llamada a sistema puede haber distintas implementaciones, como la encargada de truncar archivos (truncate
de Glibc). Dicha llamada a sistema cuenta con dos versiones en Linux: truncate
y truncate64
. Glibc se encarga de escoger la adecuada cuando un programa llama a truncate
de Glibc.
La biblioteca de C de GNU provee la función syscall
para poder invocar llamadas a sistema específicas del núcleo del sistema.[3] Si el núcleo del sistema no dispone de la llamada al sistema solicitada, Glibc devuelve el valor -1
y el código de error ENOSYS
(función no implementada) queda almacenado en la variable errno
. Un ejemplo de funcionalidad que requiere del uso de syscall()
es la llamada al sistema futex
de Linux. Esta llamada es utilizada por la Glibc para implementar los cerrojos de exclusión mutua de PThreads en GNU/Linux.[4] Glibc no proporciona un envoltorio para ser utilizada directamente por una aplicación en espacio de usuario.[5] Sin envoltorio disponible, el programador puede utilizar futex
mediante la función proxy syscall
de GNU. Los detalles de la arquitectura hardware a la hora de llamar al núcleo han de ser gestionados por la aplicación. Los detalles de la convención del lenguaje C son manejados por Glibc: guardar y restaurar registros, activar la interrupción software de entrada al núcleo, valor de retorno de la llamada a sistema y variable errno
. Utilizar syscall
dificulta la portabilidad de la aplicación, pero es más fácil que tener que gestionar en ensamblador los registros, valores de retorno e interrupción software.
Normalmente una aplicación enlazada con la biblioteca de C no utiliza rutinas integradas que manejen por sí mismas el uso de la interfaz de llamadas a sistema de Linux. Hacer eso supone interferir con la gestión que hace la biblioteca. Por ejemplo, utilizar las llamadas a sistema brk
y sbrk
que manejan el puntero de rotura (program break) interfiere con la función malloc
.
Lo primero que se ejecuta de un programa enlazado con la Glibc son una serie de rutinas llamadas desde el archivo de ensamblador start.S
. Dicho archivo pertenece a la biblioteca de C de GNU. Inicializa una serie de punteros a función y llama a __libc_start_main
. Dicha función realiza más inicializaciones, entre ellas detectar la familia del procesador para escoger versiones optimizadas de las funciones de la biblioteca. Después, la función main
es invocada.[6]
Las extensiones GNU han implementado varias funciones que más tarde fueron estandarizadas como parte del lenguaje C en su estándar C90 y C99.
Glibc es usada por GCC. La portabilidad de GCC+Glibc ha permitido a Intel optimizar la distribución de GNU/Linux Clear Linux. Al compilar con GCC utilizan una opción que dispone para generar múltiples versiones de una rutina de un programa. Esto les faculta para tener el sistema operativo optimizado para distintas generaciones de procesadores. Luego utilizan la capacidad de detección y auto optimización de la Glibc para cargar binarios de bibliotecas optimizados para la CPU. Dichos binarios son distribuidos con Clear Linux, manteniendo múltiples versiones de una misma biblioteca.[7] Los resultados de rendimiento dan una ventaja superior al 10% a favor de Clear Linux contra Ubuntu 17.10.[8]
Contenido de Glibc
- Programas instalados: 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 y zic
- Bibliotecas instaladas: 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 y libutil.[a,so]
La biblioteca libc.[a,so], que implementa la funcionalidad del estándar del lenguaje C y de GNU C, aglutina un total aproximado de 500 llamadas a sistema y funciones.
Referencias
- DJ Delorie, Andreas Schwab, Adhemerval Zanella (2016,2017). «Overview of Malloc» (en inglés). Consultado el 7 de septiembre de 2017.
- Andries Brouwer, Michael Kerrisk (1998, 2007). «syscalls - Linux system calls» (en inglés). Consultado el 7 de septiembre de 2017.
- Los regentes de la universidad de California (1980, 1991, 1993). «syscall - indirect system call» (en inglés). Consultado el 7 de septiembre de 2017.
- Darren Hart (11 de noviembre de 2009). «A futex overview and update» (en inglés). LWN.net. Consultado el 7 de septiembre de 2017.
- Thomas Gleixner, Michael Kerrisk (2015). «futex - fast user-space locking» (en inglés). Consultado el 7 de septiembre de 2017.
- Gentoo. «Mini FAQ about the misc libc/gcc crt files.». Gentoo Linux (en inglés). Gentoo Linux. Consultado el 8 de septiembre de 2017.
- Michael Larabel (15 de septiembre de 2017). «Clear Linux & Their Love For FMV + dl_platform/dl_hwcap In The Name Of Performance - Phoronix». www.phoronix.com (en inglés). Consultado el 15 de septiembre de 2017.
- Michael Larabel (12 de septiembre de 2017). «Core i9 7900X vs. Threadripper 1950X On Ubuntu 17.10, Antergos, Clear Linux - Phoronix». www.phoronix.com (en inglés). Consultado el 15 de septiembre de 2017.
Enlaces externos
- Sitio oficial de Glibc (en inglés)
- Manual de Glibc (en inglés)