<?xml version='1.0' encoding="UTF-8"?>
<!-- $Id: prelink-howto.xml,v 1.15 2012/06/30 18:42:54 swift Exp $ -->
<!DOCTYPE guide SYSTEM "/dtd/guide.dtd">
<guide disclaimer="obsolete" lang="nl">
<title>Gentoo Linux Prelink Gids</title>

<author title="Auteur">
  <mail link="cretin@gentoo.org">Stefan Jones</mail>
</author>
<author title="Redacteur"><!-- zhen@gentoo.org -->
  John P. Davis
</author>
<author title="Redacteur">
  <mail link="peesh@gentoo.org">Jorge Paulo</mail>
</author>
<author title="Redacteur">
  <mail link="swift@gentoo.org">Sven Vermeulen</mail>
</author>
<author title="Redacteur">
  <mail link="erwin@gentoo.org">Erwin</mail>
</author>
<author title="Vertaler">
  <mail link="diox@gentoo.org">Dimitry Bradt</mail>
</author>

<abstract>
Deze gids legt uit hoe je gebruik kunt maken van de prelink ondersteuning in
Portage 2.0.46 en nieuwer.
</abstract>

<license/>

<version>1.14</version>
<date>2006-05-28</date>

<chapter>
<title>Inleiding</title>
<section>
<title>Wat is Prelink en hoe kan het me helpen ?</title>
<body>

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

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

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

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

</body>
</section>
<section>
<title>Omschrijving</title>
<body>

<ul>
  <li>
    Prelinking wordt gebeurd via een programma die, verrassend, <c>prelink</c>
    heet. De veranderingen in het binair bestand om het sneller te laten
    starten.
  </li>
  <li>
    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.
  </li>
  <li>
    De verandering aan het binair bestand is volledig omkeerbaar.
    <c>prelink</c> heeft een ongedaan functie.
  </li>
  <li>
    De huidige versies van de portage kunnen omgaan, via <c>prelink</c>, met
    het veranderen van MD5sums en mtimes van de binaire bestanden.
  </li>
  <li>
    Je hoeft <c>FEATURES="prelink"</c> niet in stellen in je
    <path>make.conf</path> bestand; de Portage zal die automatisch gaan
    ondersteunen als prelink het binair bestand kan vinden.
  </li>
</ul>

</body>
</section>
</chapter>

<chapter>
<title>Instellen van Prelink</title>
<section>
<title>Installaren van Programmas</title>
<body>

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

<pre caption = "Installeren van Prelink">
# <i>emerge prelink</i>
</pre>

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

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

<p>
Als je een aantal stappen hebt die een emerge probleem genereren op een ander
systeem, gelieve <uri link="http://bugzilla.gentoo.org">Bugzilla</uri> te
controleren en een bug report aan te maken als dit nog niet is gebeurd.
</p>

</body>
</section>
<section>
<title>Voorbereiden van je systeem</title>
<body>

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

</body>
</section>
<section>
<title>Configuratie</title>
<body>

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

<pre caption="uitvoeren van env-update">
# <i>env-update</i>
</pre>

<p>
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 <path>/opt</path>. Door volgend bestand te
maken vertel je prelink geen aanstalten te maken om ze te prelinken.
</p>

<pre caption="/etc/env.d/60prelink">
PRELINK_PATH_MASK="/opt"
</pre>

<note>
Je kunt meerdere of mindere mappen aan de dubbelpunt gescheiden lijst.
</note>

</body>
</section>
</chapter>

<chapter>
<title>Prelinken</title>
<section>
<title>Prelink Gebruik</title>
<body>

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

<pre caption = "Prelinken van de lijst van bestanden">
# <i>prelink -amR</i>
</pre>

<warn>
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 <c>file</c> of
<c>readelf</c> commando om de staat van de binaire bestanden te controleren.
Alternatief, controleer de hoeveelheid vrije schrije ruimte op de harde schijf
met <c>df -h</c>.
</warn>

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

<note>
Voor meer opties en details, raadpleeg <c>man prelink</c>.
</note>

</body>
</section>
<section>
<title>Prelink Cron Taken</title>
<body>

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

</body>
</section>

<section>
<title>De snelheid van KDE opdreiven na het Prelinken</title>
<body>

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

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

</body>
</section>
</chapter>

<chapter>
<title>Gekende problemen en oplossingen</title>
<section>
<title>"Cannot prelink against non-PIC shared library"</title>
<body>

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

<p>
Hier zijn de bibliotheken die niet zijn opgelost of niet kunnen opgelost
worden:
</p>

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

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

</body>
</section>
<section>
<title>Wanneer ik mijn systeem prelink, willen enkele staties binaire bestanden
niet meer werken.</title>
<body>

<p>
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,
</p>

<p>
"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."
</p>

</body>
</section>
<section>
<title>Prelink breekt af bij "prelink: dso.c:306: fdopen_dso: Assertion
`j == k' failed."</title>
<body>

<p>
Dit is een gekend probleem, en goed gediagnostiseerd <uri
link="http://bugs.gentoo.org/show_bug.cgi?id=13878">hier</uri>. 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 <uri
link="#doc_chap2_sect2">Configuratie hoofdstuk</uri> hierboven om dit op een
gemakkelijke manier op te lossen.
</p>

</body>
</section>
<section>
<title>Ik gebruik grsecurity en het blijkt dat prelink niet werkt.</title>
<body>

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

</body>
</section>
<section>
<title>
Prelink gaat de mist in met de foutmelding "prelink: Can't walk directory tree
XXXX: Too many levels of symbolic links"
</title>
<body>

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

<pre caption="Verbeteren van symlinks">
# <i>emerge symlinks</i>
# <i>symlinks -drv /</i>
</pre>

<p>
Meer details kunnen gevonden worden op de volgende locaties: <uri
link="http://bugs.gentoo.org/show_bug.cgi?id=82117">Bugzilla</uri> en dit <uri
link="http://forums.gentoo.org/viewtopic-t-458144-highlight-prelink.html">forum
bericht</uri>.
</p>

</body>
</section>
</chapter>

<chapter>
<title>Conclusie</title>
<section>
<body>

<p>
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 <path>prelink</path> moet herstarten als je
glibc of een andere bibliotheek update! Veel succes!
</p>

</body>
</section>
</chapter>
</guide>
