5.5. Glibc-2.41

Glibc pakken inneholder C hovedbiblioteket. Dette biblioteket tilbyr de grunnleggende rutinene for tildeling av minne, søk i kataloger, åpne og lukke filer, lese og skrive filer, strenghåndtering, mønstertilpasning, aritmetikk og så videre.

Omtrentlig byggetid: 1.4 SBU
Nødvendig diskplass: 850 MB

5.5.1. Installasjon av Glibc

Først oppretter du en symbolsk lenke for LSB kompalitet. I tillegg, for x86_64 oppretter du en symbolsk kompatibilitetskobling som kreves for korrekt operasjon av den dynamiske biblioteklasteren:

case $(uname -m) in
    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
    ;;
esac
[Notat]

Notat

Kommandoen ovenfor er riktig. ln kommandoen har flere syntaktiske versjoner, så sørg for å sjekke info coreutils ln og ln(1) før du rapporterer hva som kan se ut til å være en feil.

Noen Glibc programmer bruker den FHS inkompatible /var/db mappen for å lagre deres kjøretidsdata. Bruk følgende oppdatering for å få slike programmer til å lagre sine kjøretidsdata på FHS kompatible steder:

patch -Np1 -i ../glibc-2.41-fhs-1.patch

Glibc dokumentasjonen anbefaler å bygge Glibc i en dedikert byggemappe:

mkdir -v build
cd       build

Sørg for at ldconfig og sln verktøy er installert i /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Neste, forbered Glibc for kompilering:

../configure                             \
      --prefix=/usr                      \
      --host=$LFS_TGT                    \
      --build=$(../scripts/config.guess) \
      --enable-kernel=5.4                \
      --disable-nscd                     \
      libc_cv_slibdir=/usr/lib

Betydningen av konfigureringsalternativene:

--host=$LFS_TGT, --build=$(../scripts/config.guess)

Den kombinerte effekten av disse bryterne er at Glibcs byggesystem konfigurerer seg selv til å være krysskompilert, ved hjelp av krysskoblingen og krysskompilator i $LFS/tools.

--enable-kernel=5.4

Dette forteller Glibc å kompilere biblioteket med støtte for 5.4 og senere Linux kjerner. Løsninger for eldre kjerner er ikke aktivert.

libc_cv_slibdir=/usr/lib

Dette sikrer at biblioteket er installert i /usr/lib i stedet for standard /lib64 på 64-bits maskiner.

--disable-nscd

Ikke bygg navnetjenesten cache daemon som ikke er brukt lenger.

I løpet av dette stadiet kan følgende advarsel vises:

configure: WARNING:
*** These auxiliary programs are missing or
*** incompatible versions: msgfmt
*** some features will be disabled.
*** Check the INSTALL file for required versions.

Den manglende eller inkompatible msgfmt programmet er generelt ufarlig. Dette msgfmt programmet er en del av Gettext pakken som vertsdistribusjonen skal gi.

[Notat]

Notat

Det har vært rapporter om at denne pakken kan mislykkes når den bygges som en «parallel make». Hvis dette skjer, kjør make kommandoen på nytt med et -j1 alternativ.

Kompiler pakken:

make

Installer pakken:

[Advarsel]

Advarsel

Hvis LFS ikke er riktig innstilt, og til tross for anbefalinger, bygger du som root, neste kommando vil installer den nybygde glibc til vertssystemet ditt, som mest sannsynlig vil gjøre det ubrukelig. Så dobbeltsjekk at miljøet er riktig innstilt, og at du ikke er root, før du kjører følgende kommando.

make DESTDIR=$LFS install

Betydningen av make install alternativet:

DESTDIR=$LFS

DESTDIR make variabelen brukes av nesten alle pakker for å definere plasseringen der pakken skal være installert. Hvis den ikke er angitt, er den standard til root (/) mappen. Her spesifiserer vi at pakken installeres i $LFS, som vil bli rotmappen i Seksjon 7.4, «Gå inn i Chroot miljøet»

Fiks en hardkodet sti til den kjørbare lasteren i ldd skriptet:

sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd

Nå som vår kryssverktøykjede er på plass, er det viktig å sikre at kompilering og linking vil fungere som forventet. Dette gjør vi ved å gjøre noen sunnhetssjekker:

echo 'int main(){}' | $LFS_TGT-gcc -x c - -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'

Det skal ikke være noen feil, og utdataen av den siste kommandoen vil være (som gir rom for plattformspesifikke forskjeller i det dynamiske linkernavnet):

[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]

Merk at denne stien ikke skal inneholde /mnt/lfs (eller verdien av LFS variabelen hvis du brukte en annen). Stien blir løst når det kompilerte programmet kjøres, og det skal bare skje etter at vi går inn i chroot miljøet der kjernen vil vurdere $LFS som rotmappen (/).

Sørg nå for at vi er konfigurert til å bruke de riktige startfilene:

grep -E -o "$LFS/lib.*/S?crt[1in].*succeeded" dummy.log

Utdata fra den siste kommandoen skal være:

/mnt/lfs/lib/../lib/Scrt1.o succeeded
/mnt/lfs/lib/../lib/crti.o succeeded
/mnt/lfs/lib/../lib/crtn.o succeeded

Kontroller at kompilatoren søker etter riktige deklarasjonsfiler:

grep -B3 "^ $LFS/usr/include" dummy.log

Denne kommandoen skal returnere følgende utdata:

#include <...> search starts here:
 /mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/14.2.0/include
 /mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/14.2.0/include-fixed
 /mnt/lfs/usr/include

Igjen, mappen oppkalt etter måltripletten kan være annerledes enn de ovennevnte, avhengig av systemarkitekturen.

Deretter kontrollerer du at den nye linkeren brukes med de riktige søkestiene:

grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'

Referanser til stier som har komponenter med '-linux-gnu' skal ignoreres, men ellers skal utdataene fra den siste kommandoen være:

SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib64")
SEARCH_DIR("=/usr/local/lib64")
SEARCH_DIR("=/lib64")
SEARCH_DIR("=/usr/lib64")
SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib")
SEARCH_DIR("=/usr/local/lib")
SEARCH_DIR("=/lib")
SEARCH_DIR("=/usr/lib");

Et 32-bits system kan bruke noen få andre mapper, men uansett den viktige fasiten her er at alle stiene skal begynne med et likhetstegn (=), som ville bli erstattet med systemrotmappen som vi har konfigurert for linkeren.

Deretter må du kontrollere at vi bruker riktig libc:

grep "/lib.*/libc.so.6 " dummy.log

Utdata fra den siste kommandoen skal være:

attempt to open /mnt/lfs/usr/lib/libc.so.6 succeeded

Sørg for at GCC bruker riktig dynamisk linker:

grep found dummy.log

Utdataene fra den siste kommandoen skal være (tillater plattformspesifikke forskjeller i dynamisk linkernavn):

found ld-linux-x86-64.so.2 at /mnt/lfs/usr/lib/ld-linux-x86-64.so.2

Hvis utdataen ikke vises som vist ovenfor eller ikke mottas i det hele tatt, så er det noe alvorlig galt. Undersøk og spor trinn for trinn for å finne ut hvor problemet er og rette det. Alle problemer bør løses før du fortsetter med prosessen.

Når alt fungerer som det skal, rydd opp i testfilene:

rm -v a.out dummy.log
[Notat]

Notat

Byggingen av pakkene i neste kapittel vil fungere som en ekstra sjekk at verktøykjeden er riktig bygget. Hvis noen pakker, spesielt binutils-pass2 eller gcc-pass2, ikke klarer å bygges, er det en indikasjon på at noe har gått galt med tidligere Binutils-, GCC- eller Glibc-installasjoner.

Detaljer om denne pakken finner du i Seksjon 8.5.3, «Innhold i Glibc»