6.11. Glibc-2.3.4-20040701

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: 784 MB

Glibc ist abhängig von: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed und Texinfo

6.11.1. Installieren von Glibc

Dieses Paket funktioniert nicht gut, wenn nicht die Standard Optimierungseinstellungen (inklusive der Optionen -march und -mcpu) benutzt werden. Deshalb sollten eventuell gesetzte Umgebungsvariablen, die die Standardoptimierung überschreiben - zum Beispiel CFLAGS und CXXFLAGS - für den Kompiliervorgang zurückgesetzt oder entsprechend abgeändert werden.

Das Installationssystem der Glibc ist sehr eigenständig und installiert perfekt, 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 Glibc Autoconf-Tests dann falsche Resultate ergeben würden.

Die Glibc-Dokumentation empfiehlt, nicht im Quellordner sondern in einem gesonderten Ordner zu kompilieren:

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

Bereiten Sie Glibc zum Kompilieren vor:

../glibc-2.3.4-20040701/configure --prefix=/usr \
    --disable-profile --enable-add-ons=nptl --with-tls \
    --with-__thread --enable-kernel=2.6.0 --without-cvs \
    --libexecdir=/usr/lib/glibc \
    --with-headers=/tools/glibc-kernheaders

Die Bedeutung der neuen configure-Option:

--libexecdir=/usr/lib/glibc

Das wird das Programm pt_chown in /usr/lib/glibc anstelle von /usr/libexec installieren.

Kompilieren Sie das Paket:

make
[Wichtig]

Wichtig

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

Testen Sie das Ergebnis:

make check

Die Glibc Testsuite ist sehr stark von einigen Funktionen Ihres Host-Systems abhängig, insbesondere dem Kernel. Grundsätzlich wird erwartet, dass die Glibc-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 besitzen. Bestimmte Optimierungseinstellungen haben hier ebenfalls einen gewissen Einfluss.

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

  • Der atime-Test schlägt fehl, wenn die LFS-Partition mit der Option noatime eingehängt wurde.

  • Der shm-Test kann fehlschlagen, wenn auf dem Host-System das Dateisystem devfs verwendet wird, aber aufgrund fehlender Kernelunterstützung kein tmpfs Dateisystem unter /dev/shm gemountet ist.

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

Auch wenn es nur eine harmlose Nachricht 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 installiert. Holen Sie das nach:

make localedata/install-locales

Als Alternative zu dem vorigen Kommando können Sie auch nur die von Ihnen benötigten oder gewünschten Locales installieren. Das erreichen Sie mit dem Kommando localedef. Informationen dazu finden Sie in der Datei INSTALL in den Quellen zu Glibc. Jedoch gibt es einige Locales, die essentiell für die Tests von weiteren Paketen sind, im einzelnen die libstdc++ Tests von GCC. Die folgenden Anweisungen anstelle des oben verwendeten Targets install-locales installieren einen minimalen Satz von Locales, die notwendig sind, 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 von make localedata/install-locales installierte Locales werden von bestimmten Anwendungen im LFS- bzw. BLFS-Buch nicht richtig unterstützt. Aufgrund der zahlreichen Probleme, die auftreten, wenn Programmierer Annahmen machen, die die Locales zerstören, sollte LFS nicht mit Locales benutzt werden, die Multi-Byte Zeichen (inklusive UTF-8) oder von-rechts-nach-links-schrift verwenden. Viele unoffizielle und instabile Patches werden benötigt, um diese Probleme in den Griff zu bekommen. Die LFS-Entwickler haben sich entschieden, solch komplexe Locales nicht zu unterstützen. 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 die linuxthreads Man-pages, sie sind eine großartige Referenz zur Threading-Programmierschnittstelle (auch auf NPTL anwendbar):

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

Installieren Sie diese:

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

6.11.2. Einrichten von Glibc

Sie müssen die Datei /etc/nsswitch.conf erstellen, denn obwohl Glibc bei einer fehlenden oder kaputten Datei Standardwerte vorgibt, funktionieren diese Standardwerte nicht gut mit Netzwerken. Ausserdem müssen Sie die Zeitzone korrekt einstellen.

Erstellen Sie die neue Datei /etc/nsswitch.conf, indem Sie das folgende Kommando ausführen:

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

Um herauszufinden, in welcher Zeitzone Sie sind, führen Sie dieses Skript aus:

tzselect

Nachdem Sie ein paar Fragen zu Ihrem Standort beantwortet haben, wird das Skript den Namen Ihrer Zeitzone ausgeben, ähnlich wie EST5EDT oder Canada/Eastern. 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, den Ihnen tzselect ausgeben hat (z. B Canada/Eastern).

Die Bedeutung der Option zu cp:

--remove-destination

Dadurch wird das Entfernen des bereits existierenden symbolischen Links erzwungen. Der Grund, warum wir kopieren anstatt einen symbolischen Link zu benutzen, ist der, dass wir den Fall abdecken wollen, dass /usr auf einer separaten Partition liegt. Das könnte z. B. problematisch werden, wenn in den 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 dynamischen Bibliotheken, die von ausführbaren Programmen zur Laufzeit benötigt werden. Wenn allerdings Bibliotheken ausserhalb 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. Fügen Sie diese Ordner 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 (wenn 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-Modul 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-Kode zum Implementieren des RPC-Protokolls

rpcinfo

Generiert eine RPC-Anfrage an einen RPC-Server

sln

Das statisch gelinkte Programm ln

sprof

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

tzselect

Stellt dem Anwender einige Fragen zu seinem Standort und erzeugt 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

Handhabt Speicherzugriffsfehler

libanl

Eine Bibliothek zum asynchronen Nachschlagen von Namen

libbsd-compat

Ermöglicht einigen BSD-Programmen unter Linux zu laufen

libc

Die C-Bibliothek

libcrypt

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 Kode, der beim Booten ausgeführt wird

libmemusage

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

libnsl

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

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 Kode für „Standard“-Funktionen, die in vielen verschiedenen Unix-Werkzeugen genutzt werden