6.10. Glibc-2.14.1

6.10.1. Abhängigkeiten

Glibc

   Installation hängt ab von:  Bash, Coreutils, Linux-Headers, Gawk, GCC, Gettext, Grep, Gzip, Make, Perl, Sed und Texinfo
   Test Umgebung hängt ab von:  Diffutils, Expect, DejaGNU und TCL
   Optionale Abhängigkeiten:  Autoconf, Bison, GD und SE-Linux

6.10.2. Installation der Glibc

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.)

Das Installationssystem der Glibc ist sehr eigenständig und lässt sich perfekt installieren, selbst wenn die specs-Datei unseres Compilers und der Linker immer noch auf /tools verweisen. Du kannst 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.

Damit ein kleiner Test den die Glibc während der Installation durchführt nicht fehlschlägt justieren wir eine Testdatei und erreichen so das die von uns installierte Glibc geprüft wird und nicht die Version im Verzeichnis /tools:

[Anmerkung]

Anmerkung

Falls der folgende Befehl einen Syntaxfehler wirft gehe zurück in Kapitel 5 und baue die Bash neu. Die Wahrscheinlichkeit ist sehr hoch das Du dort einen Fehler gemacht hast.

DL=$(readelf -l /bin/sh | sed -n 's@.*interpret.*/tools\(.*\)]$@\1@p') &&
sed -i "s|libs -o|libs -L/usr/lib -Wl,-dynamic-linker=$DL -o|" \
        scripts/test-installation.pl &&
unset DL

Es ist ein Bug in der Testdatei test-installation.pl den wir mit diesem sed Befehl beseitigen und damit es später keinen Fehler beim Kommando make install gibt.

sed -i -e 's/"db1"/& \&\& $name ne "nss_test1"/' scripts/test-installation.pl

Das Shell-Skript ldd enthält Bash-spezifische Syntax. Ändere daher bitte den Befehlsinterpreter zu /bin/bash für den Fall, dass ein anderes Kommando für /bin/sh installiert wird (wie z. B. im Kapitel shells von C-LFS beschrieben):

sed -i 's|@BASH@|/bin/bash|' elf/ldd.bash.in

Mit diesem Patch beseitigen wir einige Fehler die zu einem Abbruch des Build führen würden:

patch -Np1 -i ../patches/glibc-2.14.1-fixes-1.patch

Dieser Patch repariert Glibc das es mit GCC-4.6.2 gebaut werden kann:

patch -Np1 -i ../patches/glibc-2.14.1-gcc_fix-1.patch

Mit diesem sed beheben wir noch einen kleinen Fehler:

sed -i '195,213 s/PRIVATE_FUTEX/FUTEX_CLOCK_REALTIME/' \
nptl/sysdeps/unix/sysv/linux/x86_64/pthread_rwlock_timed{rd,wr}lock.S

Die Dokumentation von Glibc empfiehlt, zum Kompilieren ein gesondertes Verzeichnis zu verwenden:

mkdir -v ../glibc-build &&
cd ../glibc-build

Füge erneut die benötigten Compiler-Parameter zu den CFLAGS für die x86 Architektur hinzu:

case `uname -m` in
  i686) echo "CFLAGS += -march=i686 -mtune=native -O3 -pipe" > configparms ;;
esac

Auch hier gilt wieder, wenn der jetzt erzeugte Code nur auf dieser Maschine laufen soll, ersetze bitte -march=i686 durch -march=native. Damit erzeugt der Kompiler besser an den Prozessor angepassten Code. Dieser Code nutzt alle Möglichkeiten der CPU. Dadurch ist er aber nur noch auf Maschinen einsetzbar die den gleichen CPU-Typ haben. Code der auf einem Core2Duo mit der Option native kompiliert wird, wird nicht mehr auf einem Pentium 3 laufen. Der Parameter -pipe erhöht die Kompiliergeschwindigkeit und -O3 erhöht die Geschwindigkeit bei der Ausführung der kompilierten Programme.

Auch hier wieder, falls Du einen alten Prozessor mit i486 oder i586 hast, verwende bitte einen der zwei folgenden Befehle. Oder Du verwendest den eben beschriebenen Parameter -march=native.

Für i486:

echo "CFLAGS += -march=i486 -mtune=native -O3 -pipe" > configparms

Für i586

echo "CFLAGS += -march=i586 -mtune=native -O3 -pipe" > configparms

Bereite das Paket zum kompilieren vor:

../glibc-2.14.1/configure --prefix=/usr \
    --disable-profile --enable-add-ons \
    --enable-kernel=2.6.25 --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.

Das Paket kompilieren:

make
[Wichtig]

Wichtig

In diesem Abschnitt wird das Testsystem von Glibc als absolut kritisch betrachtet. Du solltest diesen Schritt auf keinen Fall überspringen.

Bevor wir die Tests durchlaufen lassen, kopieren wir eine Datei aus den Quellen in das Verzeichnis in dem wir die Glibc kompilieren. Dadurch werden eine Menge Testfehler vermieden. Anschließend prüfen wir die Ergebnisse:

cp -v ../glibc-2.14.1/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log

Wahrscheinlich wirst Du einen erwarteten (ignorierten) Fehler im Test posix/annexc bemerken. Des Weiteren ist das Glibc-Testsystem ein wenig vom Host-System abhängig. Dies ist eine Liste der häufigsten Fehler:

  • Der nptl/tst-cancel1-Test wird fehlschlagen, wenn die 4.1-Serie von GCC zum Einsatz kommt

  • Die Tests nptl/tst-clock2 und tst-attr3 schlagen manchmal fehl. Der Grund dafür ist nicht völlig klar; die Ursache könnte mit hoher Systemlast zusammenhängen.

  • Der math-Test schlägt manchmal fehl, wenn ein System mit einer älteren Intel- oder AMD-CPU verwendet wird.

  • Auf alter oder langsamer Hardware oder unter hoher Systemlast 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. Behebe diese störende Warnung mit:

touch /etc/ld.so.conf

Installiere das Paket:

make install

Die Sprachschemata, mit deren Hilfe Systemmeldungen in Deiner Sprache ausgegeben werden können, wurden durch das obige Kommando nicht mit installiert. Diese Sprachschemata werden nicht unbedingt benötigt, jedoch würden einige Tests der noch folgenden Pakete ohne sie ein paar Tests überspringen, das ist aber nicht weiter wichtig.

Mit dem Kommando localedef kannst Du auch einen individuellen Satz an Sprachschemata installieren. Das erste unten stehende Kommando kombiniert beispielsweise die Zeichensatz unabhängige Sprachschema Definition /usr/share/i18n/locales/de_DE mit der Zeichensatzdefinition /usr/share/i18n/charmaps/ISO-8859-1.gz und fügt das Ergebnis an die Datei /usr/lib/locale/locale-archive an. Mit den folgenden Kommandos erstellst Du einen minimalen Satz Sprachschemata, die für die kommenden Tests gut sind:

mkdir -pv /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 de_DE -f UTF-8 de_DE.UTF-8 &&
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 en_US -f UTF-8 en_US.UTF-8 &&
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 fr_FR -f UTF-8 fr_FR.UTF-8 &&
localedef -i it_IT -f ISO-8859-1 it_IT
[Anmerkung]

Anmerkung

Es ist völlig ausreichend wenn Du Dir nur die deutschen Sprachschema Definitionen installierst. Oder auch keine, da die POSIX Sprachschema Definition automatisch installiert wurde und nur diese ist wirklich notwendig.

Du kannst natürlich auch einfach alle Sprachschemata installieren:

make localedata/install-locales

6.10.3. Einrichten von Glibc

Du musst 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 musst Du die Zeitzone korrekt einstellen.

Erstelle 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

Erstelle nun mit dem folgenden Kommando die Datei /etc/localtime:

cp -v --remove-destination /usr/share/zoneinfo/Europe/Berlin \
    /etc/localtime

Die Bedeutung der Parameter für cp:

--remove-destination

Dies wird gebraucht um sicher zu stellen das der existierende Symbolische Link entfernt wird. Die Datei dorthin zu kopieren hat den Grund, falls /usr auf einer separaten Partition ist. Es wird wichtig weil z.B. im Runlevel 1 ist /usr nicht verfügbar.

6.10.4. 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, musst Du dieses Verzeichnis in /etc/ld.so.conf eintragen, damit der dynamische Lader sie finden kann. Zwei Verzeichnisse sind dafür bekannt, weitere Bibliotheken zu enthalten: /usr/local/lib und /opt/lib. Diese Verzeichnisse fügst Du gleich mit in den Suchpfad ein.

Erstelle 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

Man kann auch ein Verzeichnis erzeugen, in dem man für jedes Programm, welches die dynamischen Bibliotheken nicht in die Standard Verzeichnisse installiert, eine Konfigurationsdatei anlegt:

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

# End /etc/ld.so.conf
EOF
mkdir -v /etc/ld.so.conf.d

6.10.5. Inhalt der Glibc

Installierte Programme:  catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, pcprofiledump, pt_chown, rpcgen, 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}, libc_nonshared.a, libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a, libm.{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so}, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.{a,so}, libpthread_nonshared.a, libresolv.{a,so}, librpcsvc.a, librt.{a,so}, libthread_db.so und libutil.{a,so}

Kurze Beschreibung

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 Zeichensatz konvertierungen durch.

iconvconfig

Erzeugt schnell ladende 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.

locale

Zeigt verschiedene Informationen über die aktuelle Locale an.