8.84. Stripping

Denne delen er valgfri. Hvis den tiltenkte brukeren ikke er en programmerer og ikke planlegger å gjøre noen feilsøking på systemprogramvaren, kan systemstørrelsen reduseres med omtrent 2 GB ved å fjerne feilsøkingssymbolene, og noen unødvendige symboltabelloppføringer fra binærfiler og biblioteker. Dette medfører ingen ulemper for en typisk Linuxbruker.

De fleste som bruker kommandoene nevnt nedenfor, opplever ikke noen vanskeligheter. Det er imidlertid lett å gjøre en skrivefeil og gjør det nye systemet ubrukelig, så før du kjører strip kommandoer, er det en god ide å lage en sikkerhetskopiering av LFS systemet i gjeldende tilstand.

En strip kommando med --strip-unneeded alternativet fjerner alle feilsøkingssymboler fra en binær eller et bibliotek. Og det fjerner alle symboltabelloppføringer som ikke er nødvendig for linkeren (for statiske biblioteker) eller dynamisk linker (for dynamisk koblede binære filer og delte biblioteker).

Feilsøkingssymbolene fra utvalgte biblioteker komprimeres med Zlib og lagres i separate filer. Denne feilsøkingsinformasjon er nødvendig for å kjøre regresjonstester med valgrind eller gdb senere i BLFS.

Merk at strip vil overskrive binær eller bibliotek filen den behandler. Dette kan krasje prosessene som bruker kode eller data fra filen. Hvis prosessen som kjører strip selv er påvirket, kan binærfilen eller biblioteket som blir strippet bli ødelagt og kan gjøre systemet helt ubrukelig. For å unngå det, kopierer vi noen biblioteker og binærfiler til /tmp, stripper dem der, og installer dem tilbake med install kommandoen. (Den relaterte oppføringen i Seksjon 8.2.1, «Oppgraderingsproblemer» gir begrunnelsen for å bruke install kommandoen her.)

[Notat]

Notat

ELF lasterens navn er ld-linux-x86-64.so.2 på 64-bits systemer og ld-linux.so.2 på 32-bits systemer. Konstruksjonen nedenfor velger riktig navn for gjeldende arkitektur, unntatt noe som slutter med g, i tilfelle kommandoene nedenfor allerede har vært kjørt.

[Viktig]

Viktig

Hvis det er en en pakke som versjonen er forskjellig fra versjonen spesifisert av boken (enten etter et sikkerhetsråd eller som tilfredsstiller personlige preferanser), kan det være nødvendig å oppdatere bibliotekets filnavn i save_usrlib eller online_usrlib. Unnlatelse av å gjøre det kan gjøre systemet helt ubrukelig.

save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
             libc.so.6
             libthread_db.so.1
             libquadmath.so.0.0.0
             libstdc++.so.6.0.33
             libitm.so.1.0.0
             libatomic.so.1.2.0"

cd /usr/lib

for LIB in $save_usrlib; do
    objcopy --only-keep-debug $LIB $LIB.dbg
    cp $LIB /tmp/$LIB
    strip --strip-unneeded /tmp/$LIB
    objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

online_usrbin="bash find strip"
online_usrlib="libbfd-2.43.1.so
               libsframe.so.1.0.0
               libhistory.so.8.2
               libncursesw.so.6.5
               libm.so.6
               libreadline.so.8.2
               libz.so.1.3.1
               libzstd.so.1.5.6
               $(cd /usr/lib; find libnss*.so* -type f)"

for BIN in $online_usrbin; do
    cp /usr/bin/$BIN /tmp/$BIN
    strip --strip-unneeded /tmp/$BIN
    install -vm755 /tmp/$BIN /usr/bin
    rm /tmp/$BIN
done

for LIB in $online_usrlib; do
    cp /usr/lib/$LIB /tmp/$LIB
    strip --strip-unneeded /tmp/$LIB
    install -vm755 /tmp/$LIB /usr/lib
    rm /tmp/$LIB
done

for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
         $(find /usr/lib -type f -name \*.a)                 \
         $(find /usr/{bin,sbin,libexec} -type f); do
    case "$online_usrbin $online_usrlib $save_usrlib" in
        *$(basename $i)* )
            ;;
        * ) strip --strip-unneeded $i
            ;;
    esac
done

unset BIN LIB save_usrlib online_usrbin online_usrlib

Et stort antall filer vil bli rapportert som at filformatet ikke er gjenkjent. Disse advarslene kan trygt ignoreres. De indikerer at disse filene er skript i stedet for binære filer.