# Glibc

GNU C Library, comunament coneguda com a glibc, és la biblioteca estàndard de llenguatge C de GNU. Es distribueix sota els termes de la llicència GNU LGPL.
En els sistemes en què s'usa, aquesta biblioteca de C que proporciona i defineix les crides al sistema i altres funcions bàsiques, és utilitzada per gairebé tots els programes. És molt usada en els sistemes GNU, incloent els que utilitzen el nucli Linux. És molt portable i suporta gran quantitat de plataformes de maquinari. En els sistemes Linux s'instal·la amb el nom de libc6.

## Maquinari i nuclis suportats

Glibc és usada en sistemes que treballen amb molts nuclis diferents i diferents arquitectures de maquinari. L'ús més comú és en sistemes amb el nucli Linux en maquinari x86, però també suporta oficialment les següents plataformes de maquinari: x86, Motorola 680x0, DEC Alpha, PowerPC, ARM, ETRAX CRIS, S/390 i SPARC. Té suport oficial per nuclis GNU Hurd i Linux, encara que hi ha disponibles versions amb molts pegats que funcionen amb nuclis de FreeBSD i NetBSD (com és el cas de Debian GNU/kFreeBSD i Debian GNU/NetBSD, respectivament). És també usada (d'una forma modificada) com la libroot de BeOS i per això en Haiku.

## Funcionalitat de GNU

La Glibc no sols entrega funcionalitat segons les especificacions POSIX. També ofereix extensions GNU. Les aplicacions poden ser escrites per a POSIX o per a GNU. Glibc també implementa heurístiques en temps d'execució per a la gestió de la memòria.
La funció malloc pot tenir una gran complexitat darrere d'ella. No només es limita a reservar la quantitat demandada de memòria dinàmica en el monticle de memòria (heap) gestionat pel nucli del sistema operatiu. Glibc manté diversos blocs de memòria dinàmica que superen la capacitat demandada. Aquests blocs els administra a conveniència sense necessitat de cridar contínuament al nucli del sistema operatiu.
Un altre exemple d'heurístiques de temps d'execució implementades en Glibc consisteix en l'elecció de la crida a sistema que correspongui segons arquitectura i versió de Linux. Linux disposa de múltiples crides a sistema i no totes estan disponibles per a totes les arquitectures. A més, per a una mateixa especificació de crida a sistema pot haver diferents implementacions, com l'encarregada de truncar arxius (truncate de Glibc). Aquesta crida a sistema compta amb dues versions en Linux: truncate i truncate64. Glibc s'encarrega d'escollir l'adequada quan un programa crida a truncate de glibc.
La biblioteca de C de GNU proveeix la funció syscall per poder invocar crides a sistema específiques del nucli del sistema. Si el nucli del sistema no disposa de la crida al sistema sol·licitada, Glibc retorna el valor -1 i el codi d'error ENOSYS (crida no implementada) queda emmagatzemat en la variable errno. Un exemple de funcionalitat que requereix de l'ús de syscall és la crida al sistema futex de Linux. Aquesta crida és utilitzada per la Glibc per implementar els panys d'exclusió mútua de PThreads en GNU/Linux. Glibc no proporciona un embolcall per a ser utilitzada directament per una aplicació en espai d'usuari. Sense embolcall disponible, el programador pot utilitzar futex mitjançant la funció proxy syscall de GNU. Els detalls de l'arquitectura del maquinari a l'hora de trucar al nucli han de ser gestionats per l'aplicació. Els detalls de la convenció del llenguatge C són gestionats per Glibc: guardar i restaurar registres, activar la interrupció programàtica d'entrada al nucli, valor de retorn de la crida a sistema i variable errno. Utilitzar syscall dificulta la portabilitat de l'aplicació, però és més fàcil que haver de gestionar en assemblador els registres, valors de retorn i interrupció programàtica.
Normalment una aplicació enllaçada amb la bibilioteca de C no utilitza rutines integrades que manegen per si mateixes l'ús de la interfície de crides a sistema de Linux. Fer això suposa interferir amb la gestió que fa la biblioteca. Per exemple, utilitzar les crides a sistema brk i sbrk que maneguen el punter de trencament (program break) interfereix amb la funció malloc.
El primer que s'executa d'un programa enllaçat amb la Glibc són una sèrie de rutines trucades des de l'arxiu de assemblador start.S. Aquest arxiu pertany a la biblioteca de C del GNU. Inicialitza una sèrie de punters a funció i crida a __libc_start_main. Aquesta funció realitza més inicialitzacions, entre elles detectar la família del processador per escollir versions optimitzades de les funcions de la biblioteca. Després, la funció main és invocada.
Les extensions GNU han implementat diverses funcions que més tard van ser estandarditzades com a part del llenguatge C en el seu estàndard C90 i C99.
Glibc és usada per GCC. La portabilitat de GCC + Glibc ha permès a Intel optimitzar la distribució de GNU/Linux Clear Linux. Al compilar amb GCC utilitzen una opció que té per generar múltiples variants d'una rutina d'un programa. Això els faculta per tenir el sistema operatiu optimitzat per a diferents generacions de processadors. Després utilitzen la capacitat de detecció i auto optimització de la Glibc per carregar binaris de biblioteques optimitzats per a la CPU. Aquests binaris són distribuïts amb Clear Linux, mantenint múltiples versions d'una mateixa biblioteca. Els resultats de rendiment donen un avantatge superior al 10% a favor de Clear Linux contra Ubuntu 17.10.

## Contingut de glibc

* Programes instal·lats: 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 i ZIC
* Biblioteques instal·lades: 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 i libutil.[a, so]

## Referències

* ↑ «The GNU C Library» (en anglès). [Consulta: 10 abril 2014].
* ↑ «LIBC(7) - Linux Programmer's Manual» (en anaglès). [Consulta: 10 abril 2014].
* ↑ DJ Delorie, Andreas Schwab, Adhemerval Zanella. «Overview of Malloc» (en anglès), 2016,2017. [Consulta: 7 setembre 2017].
* ↑ Andries Brouwer, Michael Kerrisk. «syscalls - Linux system calls» (en anglès), 1998, 2007. [Consulta: 7 setembre 2017].
* ↑ «syscall - indirect system call» (en anglès). Los regentes de la universidad de California, 1980 (1991). [Consulta: 7 setembre 2017].
* ↑ Darren Hart. «A futex overview and update» (en anglès). LWN.net, 11-11-2009. [Consulta: 7 setembre 2017].
* ↑ Thomas Gleixner, Michael Kerrisk. «futex - fast user-space locking» (en anglès), 2015. [Consulta: 7 setembre 2017].
* ↑ Gentoo. «Mini FAQ about the misc libc/gcc crt files.» (en anglès). Gentoo Linux. [Consulta: 8 setembre 2017].
* ↑ Michael Larabel. «Clear Linux & Their Love For FMV + dl_platform/dl_hwcap In The Name Of Performance - Phoronix» (en anglès), 15-09-2017. [Consulta: 15 setembre 2017].
* ↑ Michael Larabel. «Core i9 7900X vs. Threadripper 1950X On Ubuntu 17.10, Antergos, Clear Linux - Phoronix» (en anglès), 12-09-2017. [Consulta: 15 setembre 2017].

## Enllaços externs

* Glibc - Lloc web oficial
* Instruccions de glibc] (anglès)