Prelink vejledningen
1.
Introduktion
Hvad er Prelink og hvordan kan det hjælpe mig?
De fleste almindelige applikationer bruger delte biblioteker. Disse
delte biblioteker skal hentes ind i hukommelsen ved runtime og de
forskellige symbolske referencer skal udforskes. For de fleste små
programmer er denne dynamiske form for linkning meget hurtig. Men for
programmer skrevet i C++ og har mange bibliotek afhængigheder, kan den
dynamiske "linkning" tage en del tid.
På de fleste systemer bliver biblioteker ikke ændret særlig tit og når
et program bliver kørt er de operationer, der bliver lavet, de samme
hver gang. Prelink udnytter dette ved at udføre linkningen og gemme
den i en eksekverbar fil, og derved præ-linke den.
Prelinkning kan skære af på opstartstiderne for
applikationer. F.eks. kan et typisk KDE-programs hentetid skæres ned
med så meget som 50%. Den eneste vedligeholdelse der kræves, er at køre
prelink igen hver gang et bibliotek bliver opgraderet til en prelinket
eksekverbar fil.
Opsummering
-
Prelinkning gøres med a program kaldet, overraskende nok,
prelink. Det ændrer den binære fil for at få den til
at starte hurtigere.
-
Hvis applikationsafhængige biblioteker ændrer sig efter at du har
prelinket det, så skal du prelinke applikationen igen, ellers
mister du hastighedsfordelene. Dette vil sige, hver gang du
opdaterer en pakke gennem Portage, der opdaterer biblioteker, så
skal de prelinkes igen.
-
Ændringen der bliver lavet på den binære fil er fuldt ud muligt at
fjerne igen. prelink har en undo funktion.
-
Nyere versioner af Portage håndterer, via prelink, de
ændrende MD5sums og mtimes fra de binære filer.
-
Du behøver ikke sætte FEATURES="prelink" i din
make.conf fil; Portage vil automatisk understøtte
prelink hvis den kan finde den binære prelink fil.
2.
At sætte prelink op
At installere programmerne
Først skal du installere prelink værktøjet. Emerge processen
verificerer automatisk at dit system kan prelinke sikkert.
Kode oversigt 2.1: At installere prelink |
# emerge prelink
|
Et større antal personer får fejl ved at emerge prelink pga. de fejlede
test. Disse test blev indsat af sikkerhedsårsager, prelinks opførsel
er udefineret, hvis du slår dem fra. Emerge fejlene er som regel kun
afhængige af centrale pakker; binutils, gcc og glic. Prøv at emerge
de pakker igen i den rækkefølge.
Bemærk:
Et tip: Hvis du får en fejl prøv at kompilere og teste prelink
selv (dvs. kør (./configure ; make ; make check
). Når det fejler kan du læse *.log filerne i test biblioteket. Dette
kan give dig brugbare spor.
|
Hvis du har et par skridt, der reproducerer den emerge fejl på et andet
system, så send dem venligst i en email til Stefan Jones.
At forberede dit system
Derefter bør du aktivere "pic" USE flaget i din /etc/make.conf
Glem ikke at køre emerge --update --deep --newuse world
sådan at USE flaget bliver indordnet i dit system.
Vær sikker på at du ikke har -fPIC sat i dine
CFLAGS/CXXFLAGS. Hvis du har, så skal du bygge hele dit system forfra
uden det.
Opsætning
Hvis du kører env-update vil du få genereret
/etc/prelink.conf filen, som
fortæller prelink hvilke filer, der skal prelinkes.
Kode oversigt 2.2: At køre env-update |
# env-update
|
Uheldigvis kan du ikke prelinke filer, der er kompileret af ældre
versioner af binutils. De fleste af disse applikationer kommer fra
præ-kompilerede, udelukkende binære pakker, som bliver installeret i
/opt. Hvis du laver den følgende fil, fortæller du prelink
om ikke at prøve at prelinke dem.
Kode oversigt 2.3: /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Bemærk:
Du kan tilføje et større eller mindre antal biblioteker til den kolon-separerede
liste.
|
3.
At prelinke
Brugen af prelink
Jeg bruger den følgende kommando til at prelinke alle de binære filer
i et bibliotek, defineret i /etc/prelink.conf.
Kode oversigt 3.1: At prelinke listede filer |
# prelink -amR
|
Advarsel:
Det er blevet bemærket at hvis du har lidt diskplads og du prelinker
hele dit system, så er der en sandsynlighed for at dine binære filer
bliver trunkeret. Resultatet bliver et ødelagt system. Brug
file eller readelf kommandoen for at tjekke en binær
fils tilstand. Alternativt kan du osse tjekke antallet af fri
diskplads på din harddisk før med df -h
|
| Mulighederne forklaret: |
| -a |
"All": prelinker alle de binære filer |
| -m |
Bevarer den plads, der er reserveret til virtuel hukommelse. Dette
er nødvendigt hvis du har en hel masse biblioteker, der skal prelinkes.
|
| -R |
Random -- blander adresse-rækkefølgen i virkårligt, dette forbedrer sikkerheden overfor buffer overflow.
|
Bemærk:
For at se flere muligheder og detaljer, se da man prelink.
|
At få KDE hurtigere efter prelinkning
KDEs loadetid kan blive reduceret meget efter at prelinke. Hvis du
informerer KDE om at det er blevet prelinket, så vil det slå starten
af kdeinit fra (da den ikke er nødvendig mere), hvilket forøger
hastigheden på KDE endnu mere.
Sæt KDE_IS_PRELINKED="true" i /etc/env.d/99kde-env
for at informere KDE omkring prelinkningen.
4.
Kendte problemer og løsninger dertil
"Kan ikke prelinke mod et ikke PIC delt bibliotek?"
Grunden til at dette problem opstår, er fra forkert kompilerede delte
biblioteker, der har været kompileret uden -fPIC muligheden til gcc for
alle objektsfilerne.
Her er de biblioteker der ikke er blevet fixet eller ikke kan fixes:
-
Bibliotekerne i wine pakken, inklusiv winex. At prelinke ville
alligevel ikke hjælpe med få mere fart på MS Windows eksekverbare
filer.
-
Biblioteket i media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
Hvis dit problem bibliotek ikke var listet, reporter det venligst,
helst med en patch til at tilføje -fPIC til de relevante CFLAGS.
Når jeg prelinker mit system så virker nogle statiske binære
filer ikke mere
Når det er glibc man betragter så eksisterer der ikke en 100%
statisk binær fil. Hvis du kompilerer den binær fil statisk med glibc,
så kan den stadig godt være afhængig af andre system filer. Nedenfor
er en forklaring af Dick Howell,
"Jeg går ud fra at ideen er, at alting vil være i den downloadede
fil, sådan at ingenting afhænger af lokale biblioteker på det system
der er målet. Uheldigvis er det sådan med Linux og alt andet der
bruger GLIBC, tror jeg, er at dette stadig ikke er helt rigtigt. Der er
denne "libnss" (name service switch, nogle folk kalder det åbenbart
network security system) som giver funktioner til at få adgang til
forskellige databaser til adgangskontrol, netværksinformation og andre
ting. Det er meningen at det skal gøre programmer uafhængige af et
separat konfigureret aktuelt netværks miljø i en maskine. En god ide,
men kan medføre problemer når det hentes. Og du kan ikke statisk linke
"libnss", da de konfigureres til hver maskine individuelt. Problemet
kommer, mener jeg, hovedsageligt fra at linke andre GLIBC biblioteker
statisk, mest af alt "libpthread", "libm", og "libc", som laver
inkompatible kald til "libnss" funktioner."
Prelink afbryder med "prelink: dso.c:306: fdopen_dso: Assertion
`j == k' failed."
Dette er et kendt problem, som venligst bliver diagnosticeret her. Prelink
kan ikke acceptere UPX-komprimerede eksekverbare filer. Fra og med
prelink-20021213 er der ikke nogen løsning bortset fra at skjule de
eksekverbare filer når du prelinker. Se Konfiguration sektionen ovenfor for en
nem måde at gøre dette på.
Jeg bruger grsecurity og det virker som om at prelinkning ikke virker.
For at prelinke på et system med grsecurity der bruger en vilkårlig
mmap() basis, er det nødvendigt at slå "randomized mmap() base" fra
for /lib/ld-2.3.*.so. Dette kan gøres med chpax
værktøjet, men det skal gøres når filen ikke er i brug (f.eks. ved at
boote fra en live-cd).
5.
Konklusion
Prelinkning kan sætte farten drastisk op mht. opstart for en del store
applikationer. Understøttelse er bygget ind i Portage. Prelinkning er
også sikkert da du altid kan undo prelinkningen for enhver binær fil
hvis du støder ind i nogen problemer. Bare husk at når du opdaterer
glibc, eller andre biblioteker som du har prelinket, bliver du nødt
til at køre prelink! For at sige det kort, held og lykke!
Indholdet i dette dokument er autoriseret under en Creative Commons -
Attribution / Share Alike licens.
|