Gentoo Logo

Disclaimer : Dit document is niet juist en is niet meer onderhouden.


Gentoo Linux Prelink Gids

Inhoud:

1.  Inleiding

Wat is Prelink en hoe kan het me helpen ?

De meest voorkomende applicaties maken gebruiken van gedeelde bibliotheken. Deze gedeelde bibliotheken moeten in het geheugen geladen worden als die worden gestart en verschillende symbolische referenties worden gemaakt. Voor het kleinste programma is deze dynamische link erg snel gemaakt. Maar voor programma's die in C++ zijn geschreven en die veel bibliotheek afhankelijkheden hebben, kan de dynamische links wel wat tijd in beslag nemen.

Op de meeste systemen, zijn bibliotheken niet vaak veranderd, en zijn de ondernomen taken om een programma te starten vaak dezelfde. Prelink neemt daaruit een voordeel, door het koppelen uit te voeren en het op te slaan in de uitvoerbaar bestand, dus een prelink maken.

Prelinking kan de opstarttijd van applicaties fel verminderen. Bijvoorbeeld, een typische KDE programma's laadtijd kan voor 50% verminderen. Het enige wat men moet doen is iedere keer een bibliotheek is geupgrade, de prelink herstarten, om het uitvoerbaar bestand aangepast te hebben.

Waarschuwing: Prelink zal niet werken met Hardened Gentoo. Dit is omdat bijde projecten proberen het adress space mapping of gedeelde bibliotheken te veranderen. Maar prelink met de -R optie verdeelt willekeurig basis bibliotheek adressen, die enige verlaging van hardened bescherming oplevert.

Omschrijving

  • Prelinking wordt gebeurd via een programma die, verrassend, prelink heet. De veranderingen in het binair bestand om het sneller te laten starten.
  • Als een applicatie afhangelijke bibliotheken veranderen na het prelinken, moet je de applicatie opnieuw prelinken, anders zal je het snelheidsvoordeel verliezen. Dit wil zeggen dat iedere keer je een pakket download via de portage, je die bibliotheken update, ze moeten her-prelinkt worden.
  • De verandering aan het binair bestand is volledig omkeerbaar. prelink heeft een ongedaan functie.
  • De huidige versies van de portage kunnen omgaan, via prelink, met het veranderen van MD5sums en mtimes van de binaire bestanden.
  • Je hoeft FEATURES="prelink" niet in stellen in je make.conf bestand; de Portage zal die automatisch gaan ondersteunen als prelink het binair bestand kan vinden.

2.  Instellen van Prelink

Installaren van Programmas

Eerst en vooral moet je het prelink hulpmiddel installeren. Het emerge proces zal automatisch controleren dat je systeem prelink veilig kunt gebruiken.

Codevoorbeeld 2.1: Installeren van Prelink

# emerge prelink

Een groep mensen krijgen fouten bij het installeren van prelink omdat ze dat ze niet slagen bij de systeem-testen. De testen zijn ingevoegt uit veiligheidsredenen, prelink's gedrag is niet ingesteld als je ze uitschakelt. De emerge fouten zijn meestal enkel afhangend van kern-pakketten; binutils, gcc en glibs. Probeer ze in die volgorde opnieuw te installeren.

Nota: Tip: als je een fout krijgt, probeer prelink dan zelf te compileren en te testen. (./configure ; make ; make check ). Bij een fout kun je dan de *.log bestanden bekijken in de testsuite map. Ze kunnen handige hints opleveren.

Als je een aantal stappen hebt die een emerge probleem genereren op een ander systeem, gelieve Bugzilla te controleren en een bug report aan te maken als dit nog niet is gebeurd.

Voorbereiden van je systeem

Controleer ook dat -fPIC niet hebt in gesteld in je CFLAGS/CXXFLAGS. Als je dit doet, zal je heel je system moeten herbouwen zonder deze instelling.

Configuratie

Het uitvoeren van env-update zal het /etc/prelink.conf bestand genereren en prelink zeggen welke files hij moet prelinken.

Codevoorbeeld 2.2: uitvoeren van env-update

# env-update

Jammer genoeg kun je nie prelink bestanden die compileerd werden door oudere versies van binutils. De meeste aplicaties komen van voorgecompileerde, binaire pakketten die geinstalleerd zijn in /opt. Door volgend bestand te maken vertel je prelink geen aanstalten te maken om ze te prelinken.

Codevoorbeeld 2.3: /etc/env.d/60prelink

PRELINK_PATH_MASK="/opt"

Nota: Je kunt meerdere of mindere mappen aan de dubbelpunt gescheiden lijst.

3.  Prelinken

Prelink Gebruik

Ik gebruik het volgende commando om alle binaire bestanden in de mappen in /etc/prelink.conf te prelinken.

Codevoorbeeld 3.1: Prelinken van de lijst van bestanden

# prelink -amR

Waarschuwing: Men heeft opgemerkt dat als u op schijf bijna vol is en u prelinkt uw volledig systeem kan er een mogelijkheid zijn dat uw binaire bestanden beknot kunnen worden. Dit kan resulteren in een gebroken systeem. Gebruik het file of readelf commando om de staat van de binaire bestanden te controleren. Alternatief, controleer de hoeveelheid vrije schrije ruimte op de harde schijf met df -h.

De opties uitgelegt:
-a "Alle": prelinks alle binaire bestanden
-m Behoud de virtueel geheugenruimte. Dit is nodig als u heel wat bibliotheken hebt die moeten zijn geprelinked.
-R Willekeurig -- het verdelen van adres opdrachten in willekeurige volgorde, verbetert de veiligheid tegen bufferoverstromingen.

Nota: Voor meer opties en details, raadpleeg man prelink.

Prelink Cron Taken

sys-devel/prelink-20060213 en later installeren een cron taak in /etc/cron.daily/prelink. Om dit in te schakelen, pas het configuratie bestand /etc/conf.d/prelink aan. Dit zal prelink elke dag uitvoeren in de achtergrond, zoals nodig is geacht. Dit bespaard je de moeite het manueel te moeten starten.

De snelheid van KDE opdreiven na het Prelinken

KDE's laadtijd kan goed worden verkleint na het prelinken. Als je KDE informeerd dat prelink is uitgevoert zal deze het laden van kdeinit (omdat het niet meer verplicht is) die KDE nog sneller kan mekan.

Stel KDE_IS_PRELINKED="true" in, in /etc/env.d/99kde-env om KDE te informeren over de prelink.

4.  Gekende problemen en oplossingen

"Cannot prelink against non-PIC shared library"

De oorzaak van dit probleem is van een slecht gecompileerde bibliotheek die werd gecompileerd zonder de -fPIC gcc optie voor al zijn object bestanden.

Hier zijn de bibliotheken die niet zijn opgelost of niet kunnen opgelost worden:

  • De bibliotheek in het wine pakket, waaronder winex. Prelinken kan de snelheid van MS Windows uitvoerbare bestanden niet verbeteren.
  • De bibliotheek in media-video/mjpegtools, /usr/lib/liblavfile-1.6.so.0.
  • Nvidia OpenGl bibliotheken, /usr/lib/opengl/nvidia/lib/libGL.so.*. Door prestatie redenen werden ze gecompileerd zonder PIC ondersteuning.

Als je probleem bibliotheek hieronder niet vermeld is, gelieve dit te melden met, bij voorkeur, een patch om -fPIC toe te voegen aan de relevante CFLAGS.

Wanneer ik mijn systeem prelink, willen enkele staties binaire bestanden niet meer werken.

Waar glibc betrokken is, is er niet siets als een 100% statisch binair bestand. Als je een binair bestand statisch compileert met glibc, kan het nog steeds afhangen van een ander systeem bestand(en). Hieronder is een verklaring door Dick Howell,

"Ik veronderstel dat het idee is dat alles in het gedownload bestand zal zijn, dus hangt er niets af van lokale bibliotheken in het doel systeem. Jammer genoeg met linux, en ik denk alles die GLIBC gebruikt, kan dit niet mogelijk zijn. Daar is dit "libnss" (name service switch, sommige mensen noemen het network security system) die functies levert om verschillende authenticatie databasesn, netwerk informatie en andere dingen te raadplegen. Het wordt verondersteld om programmas onafhankelijk te maken van de gescheiden geconfigureerde echte netwerk omgeving van de machine. Een goed idee, maar veranderingen aan GLIBC kan leiden tot problemen bij het laden. Je kunt "libnss" ok niet statisch koppelen, omdat dit voor iedere machine anders is geconfigureerd. Het probleem komt er, denk ik, bij het statisch koppelen van andere GLIBC bibliotheken, waaronder "libpthread", "libm", en "libc", van welke imcompabiliteit is tegenover "libnss" functies."

Prelink breekt af bij "prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed."

Dit is een gekend probleem, en goed gediagnostiseerd hier. Prelink kan niet werken met UPX-gecompreseerde uitvoerbare bestanden. Vanaf prelink-20021213 is er geen andere oplossing dan de uitvoerbare bestanden te verbergen wanneer je prelinkt. Raadpleeg het Configuratie hoofdstuk hierboven om dit op een gemakkelijke manier op te lossen.

Ik gebruik grsecurity en het blijkt dat prelink niet werkt.

Om prelink op een systeem met grsecurite, die gebruikt maakt van een randomized mmap() base, is het nodig om "randomized mmap() base" uit te schakelen voor /lib/ld-2.3.*.so. Dit kan worden bereikt met het chpax hulpmiddel, maar het moet gedaan worden wanneer het bestand niet in gebruik is (start bijvoorbeeld met een herstelCD)

Prelink gaat de mist in met de foutmelding "prelink: Can't walk directory tree XXXX: Too many levels of symbolic links"

Je snelkoppelingen zijn te diep genest. Dit gebeurd waneer een snelkoppeling wijst naar zichzelf. Bijvoorbeeld is /usr/lib/lib -> lib de meest voorkomende. Om dit op te lossen, kun je deze snelkoppeling manueel vinden of door gebruik te maken van het symlinks pakket.

Codevoorbeeld 4.1: Verbeteren van symlinks

# emerge symlinks
# symlinks -drv /

Meer details kunnen gevonden worden op de volgende locaties: Bugzilla en dit forum bericht.

5.  Conclusie

Prelink kan de opstartsneleheid drastisch verhogen voor vele programma's. Ondersteuning is ingebouwd in de Portage. Prelinken is ook veilig aangezien je dit altijd kunt ongedaan maken voor een binair bestand als je er een tegen komt met problmen. Denk eraan dat je prelink moet herstarten als je glibc of een andere bibliotheek update! Veel succes!



Print

Upgedate op 28 mei 2006

De originele versie van dit document wordt niet meer onderhouden

Korte inhoud: Deze gids legt uit hoe je gebruik kunt maken van de prelink ondersteuning in Portage 2.0.46 en nieuwer.

Stefan Jones
Auteur

John P. Davis
Redacteur

Jorge Paulo
Redacteur

Sven Vermeulen
Redacteur

Erwin
Redacteur

Dimitry Bradt
Vertaler

Donate to support our development efforts.

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