6.11. Glibc-2.3.4

Il pacchetto Glibc contiene la libreria C principale. Questa libreria fornisce tutte le routine di base per allocare memoria, cercare directory, aprire e chiudere file, leggerli e scriverli, manipolazione stringhe, individuazione pattern, aritmetica, e così via.

Tempo approssimativo di costruzione: 12.3 SBU
spazio su disco richiesto: 476 MB
L'installazione dipende da: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed, Texinfo

6.11.1. Installazione di Glibc

Questo pacchetto è noto per avere problemi quando vengono cambiati i suoi flag di ottimizzazione di default (incluse le opzioni -march e -mcpu). Pertanto, se dovessero essere state definite variabili di ambiente che disabilitano le nostre ottimizzazioni di default, come i flag CFLAGS e CXXFLAGS, si raccomanda di eliminarle quando si costruisce GCC.

Il sistema di costruzione di Glibc è molto bene auto-contenuto e si installerà perfettamente, nonostante i nostri specs file del compilatore e del linker puntino ancora a /tools. Non possiamo aggiustare specs e linker prima dell'installazione di Glibc, poiché i test autoconf di Glibc darebbero falsi risultati e questo vanificherebbe il nostro scopo di arrivare a una realizzazione pulita.

Prima di iniziare a costruire Glibc, ricordarsi di eliminare ogni variabile ambiente che si sovrapponga ai flag di ottimizzazione di default.

Il tarball di linuxthreads contiene le pagine man per le librerie di threading installate da Glibc. Scompattare il tarball dalla directory dei sorgenti di Glibc:

tar -xjvf /sources/glibc-linuxthreads-2.3.4.tar.bz2

Glibc ha due test che falliscono quando il kernel funzionante è il 2.6.11.x. Il problema si è scoperto essere determinato dagli stessi test, non dalla libc nè dal kernel. Se si vuole eseguire la testsuite applicare questa patch:

patch -Np1 -i ../glibc-2.3.4-fix_test-1.patch

La documentazione di Glibc raccomanda di costruire Glibc fuori dalla directory dei sorgenti, in una directory dedicata:

mkdir ../glibc-build
cd ../glibc-build

Ora preparare Glibc per la compilazione:

../glibc-2.3.4/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc

Significato delle nuove opzioni di configurazione:

--libexecdir=/usr/lib/glibc

questa cambia la locazione del programma pt_chown dal suo default, /usr/libexec, a /usr/lib/glibc.

Compilare il pacchetto:

make
[Importante]

Importante

La suite di test per Glibc in questa sezione è considerata critica. Il nostro consiglio è di non saltarla per nessuna ragione.

Testare i risultati:

make check

La suite di test di Glibc è altamente dipendente da certe funzioni del sistema host, in particolare il kernel. In generale, ci si aspetta sempre che la suite di test di Glibc passi. Tuttavia in certe circostanze alcuni fallimenti sono inevitabili. Qui c'è una lista dei problemi più comuni di cui siamo a conoscenza:

  • I test math a volte falliscono su sistemi ove la CPU non è una Intel originale relativamente nuova o un'AMD autentica. È anche noto che qui un fattore possono essere certe impostazioni di ottimizzazione.

  • Il test gettext a volte fallisce per cause dovute al sistema in uso. Le ragioni esatte non sono ancora chiare.

  • Se si ha montato la partizione LFS con l'opzione noatime il test atime fallirà. Come menzionato in Sezione 2.4, “Montaggio della nuova partizione” non usare l'opzione noatime durante la costruzione di LFS.

  • Su hardware vecchi o lenti certi test potrebbero fallire a causa del superamento dei tempi di time out dei test.

Sebbene sia un messaggio innocuo, lo stage di installazione di Glibc al termine si lamenterà per l'assenza di /etc/ld.so.conf. Correggere questo piccolo avviso fastidioso con:

touch /etc/ld.so.conf

E installare il pacchetto:

make install

Le localizzazioni che permettono al sistema di rispondere in un altro linguaggio non sono state installate dal precedente comando. Farlo con questo:

make localedata/install-locales

Per risparmiare tempo, un'alternativa all'esecuzione del comando precedente (che genera ed installa ogni Glibc locale di cui è a conoscenza) è l'installazione solo di quelle localizzazioni che si vogliono o sono necessarie. Questo lo si può ottenere usando il comando localedef. Informazioni su questo comando si trovano nel file INSTALL nei sorgenti di Glibc. Tuttavia, c'è un certo numero di localizzazioni che sono essenziali perché i test di futuri pacchetti passino, in particolare, i test libstdc++ da GCC. Le seguenti istruzioni, invece del target install-locales, usato in precedenza, installerà il minimo set necessario di localizzazioni perché i test funzionino con successo:

mkdir -p /usr/lib/locale
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i ja_JP -f EUC-JP ja_JP

In effetti, certe localizzazioni installate dal precedente comando make localedata/install-locales non sono pienamente supportate da alcune applicazioni che sono nei libri LFS e BLFS. A causa dei vari problemi che sorgono dovuti ai programmatori che fanno assunzioni che bloccano queste localizzazioni, LFS non deve essere utilizzata in localizzazioni che usano set di caratteri multibyte (incluso UTF-8) o scritture da destra a sinistra. Sono necessarie numerose patch instabili e non ufficiali per correggere questi problemi, ed è stato deciso di non supportare queste localizzazioni complesse. Questo è valido anche per le localizzazioni ja_JP e fa_IR: esse sono state installate solo per far passare i test GCC e Gettext, e ad esempio il programma watch (parte del pacchetto Procps) compilato secondo questo libro non funziona correttamente con esse. Molti tentativi di aggirare queste restrizioni sono documentati nei suggerimenti relativi all'internazionalizzazione.

Infine, costruire le pagina man dei linuxthreads, che sono un grande riferimento sulle API (applicabili anche a NPTL):

make -C ../glibc-2.3.4/linuxthreads/man

E installare queste pagine:

make -C ../glibc-2.3.4/linuxthreads/man install

6.11.2. Configurazione di Glibc

Si deve creare il file /etc/nsswitch.conf, poiché, nonostante Glibc lo fornisca di default quando questo file è mancante o corrotto, i default di Glibc non funzionano bene in un ambiente di rete. Inoltre bisogna configurare la time zone.

Creare un nuovo file /etc/nsswitch.conf eseguendo il seguente comando:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

Per sapere in quale time zone ci si trova, avviare il seguente script:

tzselect

Una volta che si è risposto a qualche domanda sulla ropria locazione, lo script darà il nome della time zone, (ad es. EST5EDT o Canada/Eastern). Quindi creare il file /etc/localtime eseguendo:

cp --remove-destination /usr/share/zoneinfo/[xxx] \
    /etc/localtime

Sostituire [xxx] con il nome della time zone che tzselect ha fornito (es., Canada/Eastern).

Significato delle opzioni di cp:

--remove-destination

questa è necessaria per forzare la rimozione di link simbolici già esistenti. La ragione per cui noi copiamo invece di fare link simbolici è di coprire la situazione in cui /usr è su una partizione separata. Questo è importante, ad esempio, se si avvia il sistema in modalità singolo utente.

6.11.3. Configurazione del Dynamic Loader

Per default il dynamic loader (/lib/ld-linux.so.2) cerca in /lib e /usr/lib le librerie dinamiche richieste dai programmi quando vengono eseguiti. Tuttavia, se ci fossero librerie in directory diverse da /lib e /usr/lib, occorre aggiungerle al file /etc/ld.so.conf perché il dynamic loader le trovi. Due directory che di solito contengono librerie aggiuntive sono /usr/local/lib e /opt/lib, perciò aggiungiamo queste directory al percorso di ricerca del dynamic loader.

Creare un nuovo file /etc/ld.so.conf eseguendo quanto segue:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf

/usr/local/lib
/opt/lib

# End /etc/ld.so.conf
EOF

6.11.4. Contenuti di Glibc

Programmi installati: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump e zic
Librerie installate: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, libc.[a,so], 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 e libutil.[a,so]

Brevi descrizioni

catchsegv

Può essere usato per creare una traccia dello stack quando un programma termina con un segmentation fault.

gencat

Genera elenchi di messaggi.

getconf

Visualizza i valori di configurazione del sistema per variabili specifiche del file system.

getent

Acquisisce valori da un database amministrativo.

iconv

Esegue una conversione del set di caratteri.

iconvconfig

Crea un file di configurazione a caricamento rapido del modulo iconv.

ldconfig

Configura i riferimenti runtime del linker dinamico.

ldd

Riporta quali librerie condivise sono richieste da ciascun dato programma o libreria condivisa.

lddlibc4

Assiste ldd con i file oggetto.

locale

Dice al compilatore di abilitare o disabilitare l'uso delle localizzazioni POSIX per operazioni incorporate.

localedef

Compila le specifiche di localizzazione.

mtrace

Legge e interpreta un file di traccia memoria e visualizza un sommario in formato leggibile

nscd

Un demone che fornisce una cache per le richieste più comuni del servizio dei nomi.

nscd_nischeck

Verifica se il modo sicuro è necessario o no per il NIS+ lookup.

pcprofiledump

Scarica le informazioni generate dal PC profiling.

pt_chown

Un programma helper per grantpt per definire il proprietario, gruppo e permessi di accesso di un pseudo terminale slave.

rpcgen

Genera codice C per implementare il protocollo Remote Procedure Call (RPC).

rpcinfo

Fa una chiamata RPC a un server RPC.

sln

Un programma ln linkato staticamente

sprof

Legge e visualizza dati di profilo degli oggetti condivisi.

tzselect

Chiede all'utente dove abita e riporta la descrizione della corrispondente time zone.

xtrace

Traccia l'esecuzione di un programma stampando la funzione correntemente eseguita.

zdump

Scarica la time zone.

zic

Il compilatore della time zone.

ld.so

Il programma helper per le librerie condivise eseguibili.

libBrokenLocale

Usato da programmi, come Mozilla, per risolvere localizzazioni "rotte".

libSegFault

Gestisce il segnale di segmentation fault.

libanl

Una libreria asincrona di ricerca nomi.

libbsd-compat

Fornisce la portabilità necessaria ad eseguire certi programmi Berkey Software Distribution (BSD) sotto Linux.

libc

La libreria C principale.

libcrypt

La libreria crittografica.

libdl

La libreria di interfaccia per il collegamento dinamico.

libg

Una libreria runtime per g++.

libieee

La libreria in virgola mobile dell'Institute of Electrical and Electronic Engineers (IEEE).

libm

La libreria matematica.

libmcheck

Contiene codice eseguito all'avvio.

libmemusage

Usato da memusage per aiutare a raccogliere informazioni sull'uso della memoria da parte di un programma.

libnsl

La libreria dei servizi di rete.

libnss*

Sono le librerie Name Service Switch, contenenti funzioni per la risoluzione di nomi di host, nomi utente, nomi gruppo, alias, servizi, protocolli ecc.

libpcprofile

Libreria utilizzata per tracciare l'ammontare di tempo processore speso in quali linee di codice sorgente.

libpthread

La libreria dei thread POSIX.

libresolv

Contiene funzioni per creare, inviare e interpretare pacchetti del server dei nomi di dominio di Internet.

librpcsvc

Contiene funzioni che forniscono diversi servizi RPC.

librt

Contiene funzioni che forniscono la maggior parte delle interfacce specificate da POSIX.1b Realtime Extension (Estensioni in real time POSIX.1b).

libthread_db

Contiene funzioni utili per costruire debugger per programmi multi-thread.

libutil

Contiene codice per le funzioni “standard” usate in molte diverse utilità Unix.