8.5. Glibc-2.38

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: 11 SBU
Nødvendig diskplass: 3.0 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.38-fhs-1.patch

Fiks nå en regresjon som forårsaker posix_memalign() funksjonen å være veldig sakte under noen forhold.

patch -Np1 -i ../glibc-2.38-memalign_fix-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.14                     \
             --enable-stack-protector=strong          \
             --with-headers=/usr/include              \
             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.14

Dette alternativet forteller byggesystemet at denne glibc kan brukes med kjerner så gamle som 4.14. 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.

--with-headers=/usr/include

Dette alternativet forteller byggesystemet hvor det skal finne kjernens API deklarasjoner.

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.

  • stdlib/tst-arc4random-thread testen er kjent for å mislykkes hvis vertskjernen er relativt gammel.

  • Noen tester, for eksempel nss/tst-nss-files-hosts-multi, er kjent for å mislykkes på relativt trege systemer på grunn av et internt tidsavbrudd.

  • I tillegg kan noen tester mislykkes med en relativt gammel CPU modell eller vertskjerneversjon.

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

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 konfigurasjonsfilen og kjøretidsmappen for nscd:

cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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.38/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.38/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 POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
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
group: files
shadow: files

hosts: files 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 ../../tzdata2023c.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, nscd, 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, /var/cache/nscd, 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

nscd

En nisse (daemon) som gir et hurtiglager for de vanligste navnetjenesteforespørsler

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.38/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