Funzioni di libreria in Linux
Le funzioni di libreria costituiscono la base della programmazione C, fornendo operazioni comuni.
Funzioni di libreria in linguaggio C
Una funzione di libreria è semplicemente una delle innumerevoli funzioni che compongono la libreria standard C. (Per brevità, quando parleremo di una funzione specifica nel resto del libro spesso useremo semplicemente funzione anziché funzione di libreria.) Lo scopo di queste funzioni è molto vario, includendo operazioni come l'apertura di un file, la conversione di un'ora in un formato leggibile dall'uomo e il confronto di due stringhe di caratteri.
Molte funzioni di libreria non utilizzano alcuna chiamata di sistema (ad esempio le funzioni di manipolazione delle stringhe). D'altra parte, alcune funzioni di libreria sono costruite sopra le chiamate di sistema. Per esempio, la funzione di libreria fopen() utilizza la chiamata di sistema open() per aprire effettivamente un file. Spesso le funzioni di libreria sono progettate per offrire un'interfaccia più amichevole rispetto alla chiamata di sistema sottostante. Ad esempio, la funzione printf() fornisce formattazione dell'output e buffering dei dati, mentre la chiamata di sistema write() si limita a scrivere un blocco di byte. Analogamente, le funzioni malloc() e free() eseguono varie operazioni di bookkeeping che le rendono un modo molto più semplice per allocare e liberare memoria rispetto alla chiamata di sistema brk().
Implementazioni della libreria standard del linguaggio C
Esistono diverse implementazioni della libreria standard C nelle varie implementazioni UNIX. L'implementazione piu' usata su Linux e' la GNU C library (glibc, http://www.gnu.org/software/libc/).
Il principale sviluppatore e manutentore della GNU C library fu inizialmente Roland McGrath. Oggi questo compito e' portato avanti da Ulrich Drepper.
Per Linux sono disponibili anche altre librerie C, incluse librerie con requisiti di memoria piu' ridotti, adatte ad applicazioni su dispositivi embedded. Esempi sono uClibc (http://www.uclibc.org/) e diet libc (http://www.fefe.de/dietlibc/).
In queste lezioni limiteremo la discussione a glibc, poiche' e' la libreria C usata dalla maggior parte delle applicazioni sviluppate su Linux.
Determinare la versione di glibc sul sistema
A volte e' necessario determinare la versione di glibc presente su un sistema. Dalla shell, possiamo farlo eseguendo il file della libreria condivisa glibc come se fosse un programma eseguibile. Quando eseguiamo la libreria in questo modo, essa stampa varie informazioni testuali, inclusa la versione:
$ /lib/libc.so.6
GNU C Library (GNU libc) stable release version 2.43.
Copyright (C) 2026 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 16.1.1 20260430.
libc ABIs: UNIQUE IFUNC ABSOLUTE
Minimum supported kernel: 4.4.0
For bug reporting instructions, please see:
<https://gitlab.archlinux.org/archlinux/packaging/packages/glibc/-/issues>.
In alcune distribuzioni Linux, la GNU C library si trova in un percorso diverso da /lib/libc.so.6. Un modo per determinare la posizione della libreria consiste nell'eseguire il programma ldd (list dynamic dependencies) su un eseguibile collegato dinamicamente a glibc (la maggior parte degli eseguibili e' collegata in questo modo). Possiamo poi ispezionare l'elenco delle dipendenze restituito per trovare il percorso della libreria condivisa glibc:
$ ldd myprog | grep libc
libc.so.6 => /usr/lib/libc.so.6 (0x00007f2995600000)
Un programma applicativo puo' determinare la versione della GNU C library presente sul sistema in due modi:
- testando delle costanti
- chiamando una funzione di libreria.
Dalla versione 2.0 in poi, glibc definisce due costanti, __GLIBC__ e __GLIBC_MINOR__, che possono essere verificate in fase di compilazione (in istruzioni #ifdef). Su un sistema con glibc 2.12 installata, queste costanti avrebbero valori 2 e 12. Tuttavia, queste costanti sono di utilita' limitata in un programma compilato su un sistema ma eseguito su un altro con una versione diversa di glibc. Per gestire questa possibilita', un programma puo' chiamare la funzione gnu_get_libc_version() per determinare la versione di glibc disponibile a run time.
#include <gnu/libc-version.h>
const char *gnu_get_libc_version(void);
Questa funzione restituisce un puntatore a una stringa terminata da null e allocata staticamente, contenente il numero di versione della GNU C library.
La funzione gnu_get_libc_version() restituisce un puntatore a una stringa, ad esempio 2.12. Possiamo ottenere informazioni di versione anche usando la funzione confstr() per recuperare il valore della variabile di configurazione (specifica di glibc) _CS_GNU_LIBC_VERSION. Questa chiamata restituisce una stringa come glibc 2.12.
In Sintesi
Le funzioni di libreria della C forniscono un'ampia gamma di servizi, da operazioni semplici a interfacce più comode per le chiamate di sistema. Alcune non dipendono affatto dalle chiamate di sistema, mentre altre le avvolgono per semplificarne l'uso. Conoscere queste differenze aiuta a scrivere codice più chiaro ed efficiente.