View Single Post
Old 08-10-2005, 20:33   #3880
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Ho installato prelink ieri e devo dire che va piuttosto bene. Le applicazioni sembrano effettivamente più reattive all' avvio .

Ecco una guida :

Guida al Prelinking su debian

Prelink è una applicazione che permette di modificare i binari dei nostri applicativi in modo da farli caricare + veloce. Quello che fa in sostanza è indicare all' interno del binario l'indirizzo virtuale della libreria dinamica da caricare senza la necessità di andarlo a pescare ogni volta che l'applicazione deve essere caricata. Oggi giorno le applicazioni + complesse possono essere linkate anche a più di 90 librerie dinamiche contemporaneamente (quelle che sotto windows sono chiamate DLL) e specialmentente i programmi C++ risentono di lentezza a caricare il codice dai files di queste librerie. Con prelink è possibile ridurre effettivamente il tempo di caricamento delle applicazioni (ovviamente ciò si fa più sentire sui computers un po' datati).

Come fare

per installare "prelink" sul proprio sistema bisogna usare apt :

Codice:
apt-get install prelink
dopo l'installazione di prelink dobbiamo configurare il file /etc/ld.so.conf per aggiungere alcuni path a librerie che sono necessarie al prelinking di certi binari , come ad esempio firefox, openoffice, nvu.
Generalmente aprendo questo file l'unica occorrenza è il path :

Codice:
/usr/X11R6/lib
Noi ora modificheremo il file per farlo diventare :

Codice:
/usr/X11R6/lib
/usr/lib/mozilla-firefox
/usr/lib/openoffice
/usr/lib/openoffice/program
/usr/lib/Adobe/Acrobat7.0/Reader/intellinux/lib
/usr/lib/nvu
Questo dobbiamo farlo perchè alcune applicazioni usano delle librerie che installano loro in path non standard (non /usr/lib) e risulta quindi necessario informare "prelink" di questi path non standard. La maggiorparte delle applicazioni comunque non ha necessità di impostazioni di path specifiche, ma certe le necessitano , o altrimenti durante il prelink ci troveremo difronte a questi errori :

Codice:
/usr/sbin/prelink: /usr/bin/devhelp-bin: Could not find one of the
dependencies
Nel file ld.so.conf ho messo i path alle applicazioni che io possiedo, se voi non possedete o usate qualcuna di queste applicazioni non includete la linea nel file ld.so.conf. A questo punto lanciate "ldconfig" per aggiornare il path delle librerie.

Dopo aver editato si può procedere a lanciare il progamma di prelinking.
Prima di lanciare il comando "prelink" assicuratevi di avere un po' di megabytes liberi sul disco dove tenete gli eseguibili , prelink durante il suo lavoro usa un po' di spazio su disco e tiene anche una cache in modo che, in caso si voglia far tornare tutto allo stato originale , sia possibile togliere il prelink agli eseguibili.
In caso lo spazio su disco si saturasse mentre prelink sta lavorando il risultato sarebbe abbastanza disastroso, perchè gli eseguibili su cui stava lavorando in quel momento rimarrebbero troncati . Per lo stesso motivo se fossi in voi eviterei di interrompere prelink durante il suo lavoro. Personalmente non ho mai provato a terminarlo mentre lavorava , ma io se fossi in voi non rischierei.

Prelink impiega un po' di minuti a seconda della quantità di eseguibili installati sul sistema e la velocità del computer in uso per completare la sua operazione. Durante il suo lavoro vedrete , con molta probabilità , messaggi di errore relativi alla libreria "libGL.so.1" e al fatto che non è stata compilata con -fPIC (questo succede in caso avete installato i drivers NVIDIA) . Ignorate questi errori, ma sappiate che purtroppo gli eseguibili sui quali avete avuto quegli errori non saranno prelinkati. Potreste trovare altri errori relativi a certe dipendenze non trovate . Anche in questo caso i files con gli errori non saranno prelinkati. Questo errore però può essere aggirabile includendo in ld.so.conf il path relativo alle librerie mancanti . Per controllare le librerie di un programma usate il programma "ldd". Ad esempio per trovare le librerie mancanti per "firefox-bin" lanciate :

Codice:
ldd /usr/lib/mozilla-firefox/firefox-bin
e vedrete tutte le librerie da cui firefox dipende. Per certe applicazioni , soprattutto quelle closed, questo truccetto può non funzionare e potrebbero generare altri errori non risolvibili. In tal caso ignorateli.

A questo punto andiamo a lanciare prelink da root con il comando :

Codice:
prelink -amvR
Con questo comando "prelink" provvederà a prelinkare tutti gli eseguibili nei path di esecuzione che incontra. In specifico le opzioni significano :
Codice:
-a --all
              Prelink all binaries and dependant libraries found in  directory
              hierarchies specified in /etc/prelink.conf.  Normally only bina-
              ries specified from command line and their  dependant  libraries
              are prelinked.

-m --conserve-memory
              When  assigning addresses to libraries, allow overlap of address
              space slots provided that the  two  libraries  are  not  present
              together  in  any  of the binaries or libraries. This results in
              smaller virtual address space range used for libraries,  on  the
              other  side  if  during  incremental  prelinking  prelink sees a
              binary which puts together two libraries which were not  present
              together  in  any  other  binary and were given the same virtual
              address space slots, then the binary cannot be prelinked.   Nor-
              mally  each  library  is assigned a unique virtual address space

-R --random
              When assigning addresses to libraries, start with random address
              within architecture dependant virtual address space range.  This
              can  make  some  buffer  overflow  attacks  slightly  harder  to
              exploit, because libraries are not present on the same addresses
              accross  different  machines.    Normally,   assigning   virtual
              addresses  starts at the bottom of architecture dependant range.

-v --verbose
              Verbose mode.  Print the  virtual  address  slot  assignment  to
              libraries  and  print  what binary or library is currently being
              prelinked.
Se volete potete guardare nelle manpage per ulteriori opzioni.

Lasciate lavorare in pace prelink per i minuti necessari all' operazione.
Quando ha finito riavviate il computer.

In caso aggiornaste certi eseguibili nel computer potete eseguire il prelink dei nuovi eseguibili lanciando lo stesso comando indicato sopra. Prelink è in grado di individuare i nuovi files che non sono prelinkati ed eseguire l'operazione solo su quelli senza dover eseguire di nuovo tutta l'operazione anche sugli altri files. Fatelo perciò dopo aver fatto un "apt-get dist-upgrade".

In caso voleste tornare allo stato originale potete togliere il prelink dai files eseguibili usando il comando:

Codice:
prelink -au
Buon prelinking a tutti

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline