Gentoo Logo

Prelink vejledningen

Indhold:

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!



Udskriv

Opdateret 21. april 2005

The original version of this document was last updated April 2, 2007

Opsummering: Denne guide informerer om hvordan man bruger prelink understøttelse i portage version 2.0.46 og senere.

Stefan Jones
Forfatter

John P. Davis
Redaktør

Jorge Paulo
Redaktør

Sven Vermeulen
Redaktør

Erwin
Redaktør

Arne Mejlholm
Oversætter

Jesper Brodersen
Korrektur

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Bytemark

Bytemark

Linux World Expo

Linux World Expo

Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.