8.5. Glibc-2.39

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: 12 SBU
Nødvendig diskplass: 3.1 GB

8.5.1. Installation of Glibc

Noen av Glibc programmene bruker ikke-FHS kompatible /var/db mappen til å lagre kjøretidsdataene i. Bruk følgende oppdatering for å forsikre om at slike programmer lagrer kjøretidsdataene deres på de FHS kompatible stedene:

patch -Np1 -i ../glibc-2.39-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øyene vil bli installert i /usr/sbin:

echo "rootsbindir=/usr/sbin" > configparms

Forbered Glibc for kompilering:

../configure --prefix=/usr                            \
             --disable-werror                         \
             --enable-kernel=4.19                     \
             --enable-stack-protector=strong          \
             --disable-nscd                           \
             libc_cv_slibdir=/usr/lib

Betydningen av konfigureringsalternativene:

--disable-werror

Dette alternativet deaktiverer alternativet -Werror sendt til GCC. Dette er nødvendig for å kjøre testpakken.

--enable-kernel=4.19

Dette alternativet forteller byggesystemet at denne glibc kan brukes med kjerner så gamle som 4.19. Dette betyr å generere løsninger i tilfelle et systemanrop introdusert i en senere versjon ikke kan brukes.

--enable-stack-protector=strong

Dette alternativet øker systemsikkerheten ved å legge til ekstra kode for å se etter bufferoverflyt "buffer overflows", for eksempel stabel (stack) knusende angrep. Merk at Glibc alltid eksplisitt overstyrer standarden til GCC, så dette alternativet er fortsatt nødvendig selv om vi har allerede spesifisert --enable-default-ssp for GCC.

--disable-nscd

Ikke bygg navnetjenesten cache daemon som ikke er brukt lenger.

libc_cv_slibdir=/usr/lib

Denne variabelen setter riktig bibliotek for alle systemer. Vi ønsker ikke at lib64 skal brukes.

Kompiler pakken:

make
[Important]

Important

I denne delen anses testpakken for Glibc som kritisk. Ikke hopp over den under noen omstendigheter.

Vanligvis består ikke noen få tester. Testfeilene som er oppført nedenfor er vanligvis trygge å ignorere.

make check

Du kan se noen testfeil. Glibc testpakken er noe avhengig av vertssystemet. Noen få feil ut av over 5000 tester kan generelt ignoreres. Dette er en liste over de vanligste problemene som er sett for nyere versjoner av LFS:

  • io/tst-lchmod er kjent for å mislykkes i LFS chroot miljøet.

  • Noen tester, for eksempel nss/tst-nss-files-hosts-multi og nptl/tst-thread-affinity* er kjent for å mislykkes på grunn av et tidsavbrudd (spesielt når systemet er relativt sakte og/eller kjører testpakken med flere parallelle make jobber). Disse testene kan identifiseres med:

    grep "Timed out" -l $(find -name \*.out)

    Det er mulig å kjøre en enkelt test på nytt med større tidsavbrudd med TIMEOUTFACTOR=<factor> make test t=<test name>. For eksempel, TIMEOUTFACTOR=10 make test t=nss/tst-nss-files-hosts-multi vil kjøre på nytt nss/tst-nss-files-hosts-multi med ti ganger det opprinnelige tidsavbruddet.

  • I tillegg kan noen tester mislykkes med en relativt gammel CPU modell (For eksempel elf/tst-cpu-features-cpuinfo) eller vertskjerne versjon (for eksempel stdlib/tst-arc4random-thread).

Selv om det er en ufarlig melding, vil installasjonsstadiet til Glibc klage på fravær av /etc/ld.so.conf. Forhindre denne advarselen med:

touch /etc/ld.so.conf

Fiks Makefile for å hoppe over en utdatert tilregnlighetssjekk som mislykkes med en moderne Glibc-konfigurasjon:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
[Important]

Important

Hvis du oppgraderer Glibc til en ny mindre versjon (for eksempel fra Glibc-2.36 to Glibc-2.39) på et kjørende LFS system, må du ta noen ekstra forholdsregler for å unngå å ødelegge systemet:

  • Oppgradering av Glibc på et LFS system før 11.0 (eksklusivt) er ikke støttet. Bygg LFS på nytt hvis du kjører et så gammelt LFS system, men du trenger en nyere Glibc.

  • Hvis du oppgraderer på et LFS system før 12.0 (eksklusivt), installer Libxcrypt med å følge Section 8.26, “Libxcrypt-4.4.36” I tillegg til en normal Libxcrypt installasjon, du MÅ følge notatet i Libxcrypt delen for å installere libcrypt.so.1* (ved å erstatte libcrypt.so.1 fra den tidligere Glibc installasjonen).

  • Hvis du oppgraderer på et LFS-system før 12.1 (eksklusivt), fjern nscd programmet:

    rm -f /usr/sbin/nscd

    Hvis dette systemet (før LFS 12.1, eksklusivt) er basert på Systemd, er det også nødvendig å deaktivere og stoppe nscd tjenesten nå:

    systemctl disable --now nscd
  • Oppgrader kjernen og start på nytt hvis den er eldre enn 4.19 (sjekk gjeldende versjon med uname -r) eller hvis du vil oppgradere den likevel, følg Section 10.3, “Linux-6.7.4”

  • Oppgrader kjerne API deklarasjonene hvis de er eldre enn 4.19 (sjekk gjeldende versjon med cat /usr/include/linux/version.h) eller hvis du vil oppgradere den likevel, følg Section 5.4, “Linux-6.7.4 API Deklarasjoner” (men fjern $LFS fra cp kommandoen).

  • Utfør en DESTDIR installasjon og oppgrader Glibc delte biblioteker på systemet ved hjelp av en enkelt install kommando:

    make DESTDIR=$PWD/dest install
    install -vm755 dest/usr/lib/*.so.* /usr/lib

Det er viktig å strengt følge disse trinnene ovenfor med mindre du forstår helt hva du gjør. Ethvert uventet avvik kan gjøre systemet helt ubrukelig. DU ER ADVART.

Fortsett deretter å kjøre make install kommandoen, sed kommandoen mot /usr/bin/ldd, og kommandoene som skal installere lokalitetene. Når de er ferdige, start systemet på nytt med en gang.

Installer pakken:

make install

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

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

Installer deretter lokalitetene som kan få systemet til å svare i et annet språk. Ingen av disse stedene er påkrevd, men hvis noen av dem mangler, vil testpakkene til noen pakker hoppe over viktige testsaker.

Individuelle lokaliteter kan installeres ved å bruke localedef programmet. For eksempel den andre localedef kommandoen nedenfor kombinerer /usr/share/i18n/locales/cs_CZ tegnsettuavhengig lokalitetsdefinisjonen med /usr/share/i18n/charmaps/UTF-8.gz tegnsett definisjonen og legger resultatet til /usr/lib/locale/locale-archive filen. Følgende instruksjoner vil installere minimumssettet med lokaliteter som er nødvendige for optimal dekning av tester:

mkdir -pv /usr/lib/locale
localedef -i C -f UTF-8 C.UTF-8
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
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 el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.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_ES -f ISO-8859-15 es_ES@euro
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 is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8

Installer i tillegg lokaliteten for ditt eget land, språk og tegnsett.

Alternativt kan du installere alle lokaliteter som er oppført i glibc-2.39/localedata/SUPPORTED filen (den inkluderer alle lokaliteter oppført ovenfor og mange flere) med en gang med denne tidkrevende kommandoen:

make localedata/install-locales

Bruk deretter localedef kommandoen for å lage og installere lokaliteter som ikke er oppført i glibc-2.39/localedata/SUPPORTED filen når du trenger dem. For eksempel er følgende to lokaliteter nødvendig for noen tester senere i dette kapittelet:

localedef -i C -f UTF-8 C.UTF-8
localedef -i ja_JP -f SHIFT_JIS ja_JP.SJIS 2> /dev/null || true
[Note]

Note

Glibc bruker nå libidn2 når den løser internasjonalisert domenenavn. Dette er en kjøretids avhengighet. Hvis denne evnen er nødvendig, er instruksjonene for installasjon av libidn2 i BLFS libidn2 siden.

8.5.2. Konfigurere Glibc

8.5.2.1. Legge til nsswitch.conf

/etc/nsswitch.conf filen må opprettes fordi Glibc standardene ikke fungerer bra i et nettverksmiljø

Opprett en ny fil /etc/nsswitch.conf ved å kjøre følgende:

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

passwd: files systemd
group: files systemd
shadow: files systemd

hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns
networks: files

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

# End /etc/nsswitch.conf
EOF

8.5.2.2. Legge til tidssonedata

Installer og sett opp tidssonedataene med følgende:

tar -xf ../../tzdata2024a.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

Betydningen av zic kommandoene:

zic -L /dev/null ...

Dette skaper posix tidssoner uten noen skuddsekunder. Det er konvensjonelt å legge disse i både zoneinfo og zoneinfo/posix. Det er nødvendig for å legge POSIX tidssonene i zoneinfo, ellers vil forskjellige testpakker rapportere feil. På et innebygd system, hvor plass er stramt og du aldri har tenkt å oppdatere tidssonene, kan du spare 1,9 MB ved å ikke bruke posix mappen, men noen applikasjoner eller testpakker kan produsere noen feil.

zic -L leapseconds ...

Dette skaper riktige tidssoner, inkludert skuddsekunder. På en innebygd system, hvor det er trangt om plass og du ikke har tenkt å oppdatere tidssonene noen gang, eller ikke bryr deg om riktig tid, kan du spar 1,9 MB ved å utelate right mappen.

zic ... -p ...

Dette oppretter posixrules filen. Vi bruker New York fordi POSIX krever at reglene for sommertid er i samsvar med amerikanske regler.

En måte å bestemme den lokale tidssonen på er å kjøre følgende skript:

tzselect

Etter å ha svart på noen spørsmål om lokaliteten, vil skriptet skrive ut navnet på tidssonen (f.eks., America/Edmonton). Det er også noen andre mulige tidssoner oppført i /usr/share/zoneinfo som for eksempel Canada/Eastern eller EST5EDT som ikke identifiseres av skriptet, men kan brukes.

Deretter oppretter du /etc/localtime filen med å kjøre:

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

Erstatt <xxx> med navnet på den valgte tidssonen (f.eks. Europe/Oslo).

8.5.2.3. Konfigurere den dynamiske lasteren

Som standard den dynamiske lasteren (/lib/ld-linux.so.2) søker gjennom /usr/lib for dynamiske biblioteker som trengs av programmer når de kjøres. Imidlertid, hvis det er biblioteker i andre kataloger enn /usr/lib, må disse legges til /etc/ld.so.conf filen for at den dynamiske lasteren skal finne dem. To kataloger som er allment kjent å inneholde flere biblioteker er /usr/local/lib og /opt/lib, så legg disse mappene til den dynamiske lasterens søkebane.

Opprett en ny fil /etc/ld.so.conf ved å kjøre følgende:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

Om ønskelig kan den dynamiske lasteren også søke i en mappe og inkludere innholdet i filene som finnes der. Vanligvis vil filene i denne mappen inkludere en linje som spesifiserer ønsket biblioteksti. For å legge til denne funksjonen, kjør følgende kommandoer:

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

EOF
mkdir -pv /etc/ld.so.conf.d

8.5.3. Innhold i Glibc

Installerte programmer: gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, ld.so (symlenke til ld-linux-x86-64.so.2 or ld-linux.so.2), locale, localedef, makedb, mtrace, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump, og zic
Installerte biblioteker: ld-linux-x86-64.so.2, ld-linux.so.2, libBrokenLocale.{a,so}, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libc_malloc_debug.so, libdl.{a,so.2}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.so.1, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so.0}, libresolv.{a,so}, librt.{a,so.1}, libthread_db.so, og libutil.{a,so.1}
Installerte mapper: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo, og /var/lib/nss_db

Korte beskrivelser

gencat

Genererer meldingskataloger

getconf

Viser systemkonfigurasjonsverdiene for filsystem spesifikke variabler

getent

Henter oppføringer fra en administrativ database

iconv

Utfører tegnsettkonvertering

iconvconfig

Skaper hurtiglastings iconv modulkonfigurasjons filer

ldconfig

Konfigurerer dynamiske lenker til kjøretidsbindingene

ldd

Rapporter hvilke delte biblioteker som kreves av hvert gitt program eller delte bibliotek

lddlibc4

Assisterer ldd med objektfiler. Det eksisterer ikke på nyere arkitekturer som x86_64

locale

Skriver ut forskjellig informasjon om gjeldende lokalitet

localedef

Kompilerer lokalitetsspesifikasjoner

makedb

Oppretter en enkel database fra tekst inndata

mtrace

Leser og tolker en minnesporingsfil og viser et sammendrag i menneskelestbart format

pcprofiledump

Dumper informasjon generert av PC profiling

pldd

Viser dynamiske delte objekter som brukes av kjørende prosesser

sln

En statisk koblet ln program

sotruss

Sporer delte biblioteksprosedyrekall for en spesifisert kommando

sprof

Leser og viser profileringsdata for delte objekter

tzselect

Spør brukeren om lokaliteten til systemet og rapporterer den tilsvarende tidssonebeskrivelsen

xtrace

Sporer kjøringen av et program ved å skrive ut gjeldende utført funksjon

zdump

Tidssone dumperen

zic

Tidssonekompilatoren

ld-*.so

Hjelpeprogrammet for kjørbare delte biblioteker

libBrokenLocale

Brukes internt av Glibc som et grovt hack for å få ødelagte programmer (f.eks. noen Motif-applikasjoner) kjørende. Se kommentarer i glibc-2.39/locale/broken_cur_max.c for mer informasjon

libanl

Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere var det asynkront navneoppslagsbibliotek, hvor funksjoner nå er i libc

libc

C hovedbiblioteket

libc_malloc_debug

Slår på minneallokeringskontroll når den er forhåndslastet

libdl

Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere var den dynamisk koblingsgrensesnittbibliotek, funksjonene er nå i libc

libg

Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere var det et kjøretidsbibliotek for g++

libm

Det matematiske biblioteket

libmvec

Matematisk vektorbibliotek, koblet inn etter behov når libm blir brukt

libmcheck

Slår på minneallokeringskontroll når den er koblet til

libmemusage

Brukt av memusage for å hjelpe til med å samle inn informasjon om minnebruken til et program

libnsl

Nettverkstjenestebiblioteket, nå avviklet

libnss_*

Navnetjenestebrytermodulene, som inneholder funksjoner for å løse vertsnavn, brukernavn, gruppenavn, aliaser, tjenester, protokoller osv. Lastet av libc ifølge konfigurasjon i /etc/nsswitch.conf

libpcprofile

Kan forhåndslastes til PC profile en kjørbar fil

libpthread

Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere inneholdt den funksjoner som gir de fleste grensesnittene som er spesifisert av POSIX.1c Threads Extensions og semaforgrensesnittene spesifisert av POSIX.1b Real-time Extensions, nå er funksjonene i libc

libresolv

Inneholder funksjoner for å lage, sende og tolke pakker til domenenavnservere

librt

Inneholder funksjoner som gir de fleste grensesnittene som er spesifisert av POSIX.1b Real-time Extensions

libthread_db

Inneholder funksjoner som er nyttige for å bygge feilsøkere for flertrådede programmer

libutil

Dummy bibliotek som ikke inneholder noen funksjoner. Tidligere inneholdt den kode for standard funksjoner som brukes i mange forskjellige Unix verktøy. Disse funksjonene er nå i libc