Glibc
# 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.

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.

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. 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. 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. Glibc no proporciona un envoltorio para ser utilizada directamente por una aplicación en espacio de usuario. 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.

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. Los resultados de rendimiento dan una ventaja superior al 10% a favor de Clear Linux contra Ubuntu 17.10.

## 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.

