6.11. Glibc-2.3.4

Glibc enthält die C-Bibliothek. Sie stellt Systemaufrufe und grundlegende Funktionen zur Verfügung (z. B. das Zuweisen von Speicher, Durchsuchen von Ordnern, Öffnen und Schließen sowie Schreiben von Dateien, Zeichenkettenverarbeitung, Mustererkennung, Arithmetik etc.)

Geschätzte Kompilierzeit: 12.3 SBU
Ungefähr benötigter Festplattenplatz: 476
Die Installation ist abhängig von: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed und Texinfo

6.11.1. Installation von Glibc

Dieses Paket funktioniert unter Umständen nicht fehlerfrei, wenn die voreingestellten Optionen für Compiler-Optimierungen übergangen werden. (Dazu gehören auch -march und -mcpu.) Daher sollten die entsprechenden Umgebungsvariablen (wie z. B. CFLAGS und CXXFLAGS) für den Kompiliervorgang zurückgesetzt oder entsprechend abgeändert werden.

Das Installationssystem der Glibc ist sehr unabhängig und lässt sich perfekt installieren, selbst wenn die specs-Datei unseres Compilers und der Linker immer noch auf /tools verweisen. Sie können die specs-Datei und den Linker nicht vor der Installation von Glibc modifizieren, weil die Autoconf-Tests von Glibc dann falsche Resultate ergeben würden.

Das Tar-Archiv von Linxthreads enthält unter anderem auch die Man-Pages für die von Glibc installierte Threading-Bibliothek. Entpacken Sie das Tar-Archiv innerhalb des GLibc Quellordners:

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

Glibc enthält zwei Testsuites die fehlschlagen, wenn der laufende Kernel 2.6.11.x ist. Das Problem sind hier die Tests selbst, nicht die libc oder der Kernel. Wenn Sie die Testsuite durchlaufen lassen möchten, wenden Sie diesen Patch an:

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

Die Dokumentation von Glibc empfiehlt, zum Kompilieren einen gesonderten Ordner zu verwenden:

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

Bereiten Sie Glibc zum Kompilieren vor:

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

Die Bedeutung der neuen Parameter zu configure:

--libexecdir=/usr/lib/glibc

Dadurch wird das Programm pt_chown in /usr/lib/glibc anstelle von /usr/libexec installiert.

Kompilieren Sie das Paket:

make
[Wichtig]

Wichtig

In diesem Abschnitt wird die Testsuite von Glibc als absolut kritisch betrachtet. Sie sollten diesen Schritt unter keinen Umständen überspringen.

Testen Sie das Ergebnis:

make check

Die Testsuite von Glibc ist sehr stark von einigen Funktionen Ihres Host-Systems abhängig, insbesondere dem Kernel. Grundsätzlich wird erwartet, dass die Testsuite fehlerfrei durchläuft. Nichtsdestotrotz können Fehler unter bestimmten Umständen manchmal nicht vermieden werden. Hier ist eine Liste der uns allgemein bekannten Probleme:

  • Der math-Test schlägt manchmal fehl, wenn Sie ein System mit einer älteren Intel- oder AMD-CPU verwenden. Bestimmte Optimierungseinstellungen haben hier ebenfalls einen gewissen Einfluss.

  • Der gettext-Test schlägt manchmal aufgrund von Host-bedingten Problemen fehl. Die genauen Ursachen sind bislang nicht ganz geklärt.

  • Falls Sie die LFS-Partition mit der Option noatime eingehängt haben, wird der atime-Test fehlschlagen. Wie schon unter Abschnitt 2.4, „Einhängen (mounten) der neuen Partition“ erwähnt wurde, sollten Sie den Parameter noatime beim Bau von LFS nicht verwenden.

  • Auf alter oder langsamer Hardware können einige Tests aufgrund von Zeitüberschreitungen fehlschlagen.

Auch wenn es nur eine harmlose Meldung ist, die Installationsroutine von Glibc wird sich über die fehlende Datei /etc/ld.so.conf beschweren. Beheben Sie diese störende Warnung mit:

touch /etc/ld.so.conf

Installieren Sie das Paket:

make install

Die Locales wurden durch das obige Kommando nicht mitinstalliert. Holen Sie das nun nach:

make localedata/install-locales

Alternativ können Sie auch nur die von Ihnen benötigten oder gewünschten Locales installieren. Das geht mit dem Kommando localedef. Detailliertere Informationen dazu finden Sie in der Datei INSTALL aus den Quellen von Glibc. Es gibt jedoch einige Locales die für die Tests von weiteren Paketen vorausgesetzt werden: z. B. die libstdc++-Tests von GCC. Die folgenden Anweisungen installieren einen minimalen Satz von notwendigen Locales, um die nachfolgenden Tests erfolgreich durchführen zu können:

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

Einige der von make localedata/install-locales installierten Locales werden von bestimmten Anwendungen im LFS- bzw. BLFS-Buch nicht richtig unterstützt. Viele Programmierer machen falsche Annahmen zu Locales. Daraus entstehen Probleme, die die Locales zerstören. Aus diesem Grund sollten Sie LFS nicht mit Multibyte-Locales (inkl. UTF-8) oder Rechts-nach-Links-Schrift verwenden. Um diese komplexen Locales zu unterstützen sind viele unoffizielle und instabile Patches nötig. Das betrifft auch die Locales ja_JP und fa_IR—sie wurden nur installiert, damit GCC und Gettext keine Probleme in den Testsuites haben. Das Programm watch aus dem Paket Procps funktioniert z. B. nicht richtig in diesen Locales. Verschiedene Versuche, diese Restriktionen zu umgehen, sind in den Tipps zur internationalisierung nachzulesen.

Erzeugen Sie nun die Man-pages von linuxthreads, sie sind eine großartige Referenz zur Threading-Programmierschnittstelle (auch auf NPTL anwendbar):

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

Installieren Sie diese:

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

6.11.2. Einrichten von Glibc

Sie müssen die Datei /etc/nsswitch.conf erstellen. Glibc gibt zwar Standardwerte vor wenn die Datei fehlt oder beschädigt ist, aber diese funktionieren nicht besonders gut mit Netzwerken. Außerdem müssen Sie die Zeitzone korrekt einstellen.

Erstellen Sie nun die Datei /etc/nsswitch.conf:

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

Mit diesem Skript finden Sie heraus, in welcher Zeitzone Sie sich befinden:

tzselect

Nachdem Sie ein paar Fragen zu Ihrem Standort beantwortet haben, wird das Skript den Namen Ihrer Zeitzone ausgeben. Die Ausgabe könnte z. B. EST5EDT oder Canada/Eastern lauten. Erstellen Sie dann die Datei /etc/localtime, indem Sie folgendes ausführen:

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

Anstelle von [xxx] müssen Sie natürlich den Namen der Zeitzone einsetzen, der Ihnen von tzselect ausgegeben wurde (z. B Canada/Eastern).

Die Bedeutung der Option zu cp:

--remove-destination

Dadurch wird das Entfernen des bereits vorhandenen symbolischen Links erzwungen. Sie ersetzen den Link durch eine Kopie der echten Datei, weil wir den Fall abdecken wollen, das /usr auf einer separaten Partition liegen könnte. Das würde z. B. dann problematisch werden, wenn der Single-User-Modus gebootet wird.

6.11.3. Einrichten des dynamischen Laders

Per Voreinstellung sucht der dynamische Lader (/lib/ld-linux.so.2) in /lib und /usr/lib nach den dynamischen Bibliotheken, die zur Laufzeit von ausführbaren Programmen benötigt werden. Wenn die benötigten Bibliotheken allerdings außerhalb von /lib und /usr/lib liegen, müssen Sie diese Ordner in /etc/ld.so.conf eintragen, damit der dynamische Lader sie finden kann. Zwei Ordner sind dafür bekannt, weitere Bibliotheken zu enthalten: /usr/local/lib und /opt/lib. Diese Ordner fügen Sie gleich mit in den Suchpfad ein.

Erstellen Sie die neue Datei /etc/ld.so.conf mit dem folgenden Kommando:

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. Inhalt von Glibc

Installierte Programme: 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 und zic
Installierte Bibliotheken: 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 und libutil.[a,so]

Kurze Beschreibungen

catchsegv

Kann zum Erzeugen eines Stacktrace benutzt werden (falls ein Programm mit einem Speicherzugriffsfehler abstürzt).

gencat

Erzeugt Nachrichtenkataloge.

getconf

Zeigt System-Konfigurationswerte für dateisystemspezifische Variablen an.

getent

Liest Einträge aus einer administrativen Datenbank.

iconv

Führt Zeichensatzkonvertierungen durch.

iconvconfig

Erzeugt schnellladende iconv Konfigurationsdateien.

ldconfig

Richtet die Laufzeitbindungen des dynamischen Linkers ein.

ldd

Gibt aus, welche gemeinsamen Bibliotheken von einem Programm oder einer Bibliothek benötigt werden.

lddlibc4

Unterstützt ldd bei der Arbeit mit Objektdateien.

locale

Ein Perl-Programm, das im Compiler die Verwendung von POSIX-Locales für eingebaute Operationen ein- bzw. ausschaltet.

localedef

Erzeugt Locale-Spezifikationen.

mtrace

Liest und interpretiert eine Speicher-Rückverfolgungsdatei und gibt eine normal lesbare Zusammenfassung aus.

nscd

Der „name service cache daemon“; er stellt einen Zwischenspeicher für die meisten namensbasierten Anfragen zur Verfügung.

nscd_nischeck

Prüft, ob für NIS+-Anfragen der sichere Modus benötigt wird.

pcprofiledump

Gibt Informationen aus, die durch PC-Profiling erzeugt wurden.

pt_chown

Ist ein Hilfsprogramm zu grantpt. Es setzt Besitzer, Gruppe und Zugriffsberechtigungen von Slave-Pseudo-Terminals.

rpcgen

Erzeugt C-Code zum Implementieren des RPC-Protokolls.

rpcinfo

Generiert eine RPC-Anfrage an einen RPC-Server.

sln

Dies ist die statisch gelinkte Variante von ln.

sprof

Liest Profiling-Daten zu Shared-Objects und zeigt sie an.

tzselect

Stellt dem Anwender einige Fragen zu seinem Standort und erzeugt aus den Antworten eine passende Zeitzonenbeschreibung.

xtrace

Verfolgt den Durchlauf eines Programmes, indem es die jeweils ausgeführte Funktion ausgibt.

zdump

Gibt Zeitzonen aus.

zic

Ist ein Compiler für Zeitzonen.

ld.so

Ist ein Hilfsprogramm für ausführbare gemeinsame Bibliotheken.

libBrokenLocale

Wird von Programmen wie z. B. Mozilla verwendet, um Probleme mit defekten Locales zu beheben.

libSegFault

Kümmert sich um die Verarbeitung von Speicherzugriffsfehlern.

libanl

Eine Bibliothek zum asynchronen Nachschlagen von Namen.

libbsd-compat

Mit Hilfe dieser Bibliothek können einige BSD-Programme unter Linux lauffähig gemacht werden.

libc

Dies ist die C-Bibliothek.

libcrypt

Dies ist die Kryptographie-Bibliothek.

libdl

Eine Schnittstellenbibliothek zum dynamischen Linker.

libg

Eine Laufzeitbibliothek zu g++.

libieee

Die Fließkomma-Bibliothek des Institute of Electrical and Electronic Engineers (IEEE).

libm

Die mathematische Bibliothek.

libmcheck

Enthält Code, der beim Booten ausgeführt wird.

libmemusage

Wird von memusage verwendet und hilft beim Sammeln von Informationen über die Speichernutzung eines Programms.

libnsl

Dies ist die Bibliothek für Netzwerkdienste.

libnss

Die Name Service Switch-Bibliotheken. Sie enthalten Funktionen zum Auflösen von Hostnamen, Benutzernamen, Gruppennamen, Aliasen, Diensten, Protokollen und so weiter.

libpcprofile

Enthält Profiling-Funktionen, die zum Verfolgen der CPU-Benutzung einzelner Quelltextzeilen verwendet werden können.

libpthread

Die POSIX-Threads-Bibliothek.

libresolv

Enthält Funktionen zum Erzeugen, Senden und Auswerten von Paketen an Internet Domain Name Server (DNS).

librpcsvc

Enthält Funktionen, die verschiedene RPC-Dienste zur Verfügung stellen.

librt

Diese Bibliothek enthält Funktionen mit Schnittstellen für die meisten POSIX.1b Echtzeiterweiterungen.

libthread_db

Enthält Funktionen, die zum Erzeugen von Debuggern für Multi-Thread-Programme nützlich sind.

libutil

Enthält Code für „Standard“-Funktionen, die in vielen verschiedenen Unix-Werkzeugen genutzt werden.