Gentoo Linux Prelink Guide
1.Introduzione
Cos'è il prelink e come può essermi d'aiuto?
Le più comuni applicazioni utilizzano librerie condivise. Queste librerie
condivise devono essere caricate in memoria durante l'esecuzione ed i vari
simboli e riferimenti devono essere risolti. Per la maggior parte dei piccoli
programmi tale linking dinamico è molto veloce, ma per i programmi scritti in
C++ che dipendono da molte librerie, il linking dinamico può richiedere una
discreta quantità di tempo.
Nella maggior parte dei sistemi le librerie non vengono modificate molto spesso
e, quando un programma è avviato, le operazioni effettuate per il linking sono
sempre le stesse. Il prelink sfrutta questa particolarità estraendo le
informazioni relative al linking e memorizzandole nell'eseguibile,
prelinkandolo, appunto.
Il prelinking può accorciare il tempo di apertura delle applicazioni. Ad
esempio, il tempo di caricamento di un qualsiasi programma KDE può essere
abbreviato fino al 50%. Le uniche operazioni di manutenzione richieste prevedono
di lanciare prelink ogni volta che una libreria di un eseguibile prelinkato
viene aggiornata.
In breve
-
Il prelinking viene effettuato attraverso un programma chiamato,
incredibilmente, prelink, che modifica gli eseguibili per farli
partire più velocemente.
-
Se una libreria da cui dipende un'applicazione viene modificata dopo il
prelink, è necessario prelinkare nuovamente l'eseguibile, altrimenti si
perdono i vantaggi in termini di prestazioni. In altre parole, ogni volta
che viene aggiornato con portage un pacchetto che aggiorna delle
librerie, è necessario effettuare
nuovamente il prelink.
-
I cambiamenti agli eseguibili sono completamente
reversibili. prelink ha una funzione di undo.
-
Le versione corrente di Portage tratta correttamente, attraverso
prelink, i cambiamenti di MD5sum e mtime degli eseguibili.
-
Non è necessario impostare FEATURES="prelink" in
make.conf: Portage si appoggerà automaticamente a prelink
se troverà il file binario 'prelinkato'.
2.Impostare il Prelink
Installare i programmi
Per iniziare è necessario installare prelink. Durante l'esecuzione,
emerge verifica automaticamente che prelink sia supportato dal tuo sistema.
Ora è possibile emergere i tool di prelinking. L'installazione verifica
automaticamente che nel sistema il prelink possa essere attivato in modo sicuro.
Esempio 1: Installazione di prelink |
# emerge prelink
|
Molte persone hanno problemi emergendo prelink perché i test effettuati
falliscono. I test sono stati inseriti per motivi di sicurezza e il
comportamento di prelink è imprevedibile se vengono disabilitati. Gli errori di
emerge sono di solito relativi a pacchetti fondamentali come binutils, gcc e
glibc. Prova a ri-emergerli in questo ordine.
Nota:
Tip: Se ottieni degli errori prova a compilare e testare prelink
manualmente (./configure ; make ; make check ). In caso di
problemi consulta i file *.log nella directory testsuite, che potrebbero fornire
alcuni utili suggerimenti.
|
Se puoi riprodurre passo passo un errore di emerge su un altro sistema manda una
mail a Stefan Jones.
Preparare il sistema
A questo punto è necessario aggiungere la use FLAG "pic" a
/etc/make.conf. Non dimenticare di eseguire emerge --update
--deep --newuse world in modo tale da incorporare il cambiamento di use
FLAG nel tuo sistema.
Assicurati anche di non avere -fPIC nelle CFLAGS/CXXFLAGS. Se così
fosse, dovrai togliere -fPIC e ricompilare l'intero sistema.
Configurazione
L'esecuzione di env-update genera il file /etc/prelink.conf
da cui prelink rileva i files da prelinkare.
Esempio 2: Eseguire env-update |
# env-update
|
Purtroppo non è possibile abilitare il prelink per file compilati con vecchie
versioni di binutils. La maggior parte di queste applicazioni proviene da
pacchetti precompilati o binary-only, che sono installati in /opt.
Creando il seguente file possiamo evitare che prelink tenti di prelinkarli.
Esempio 3: /etc/env.d/60prelink |
PRELINK_PATH_MASK="/opt"
|
Nota:
È possibile aggiungere altre directory separandole con i due punti (:).
|
3.Prelinking
Utilizzo di prelink
Io utilizzo il seguente comando per prelinkare tutti gli eseguibili nelle
directory elencate da /etc/prelink.conf.
Esempio 4: Prelink dei file elencati |
# prelink -amR
|
Attenzione:
È stato osservato che se si dispone di poco spazio libero su disco e si prelinka
l'intero sistema è possibile che gli eseguibili vengano troncati. Il risultato
finale è un sistema corrotto. Utilizza i comandi file o readelf
per verificare lo stato dei file binari. In alternativa, controlla lo spazio
libero su disco con df -h prima di procedere.
|
| La spiegazione delle opzioni: |
| -a |
"All": prelinka tutti i binari. |
| -m |
Conserva lo spazio in memoria virtuale. È necessario
se ci sono molte librerie che hanno bisogno di essere
prelinkate.
|
| -R |
Random -- rende casuale l'ordinamento degli
indirizzi, in modo da aumentare la sicurezza
verso i buffer overflow.
|
Nota:
Per maggiori opzioni e gli altri dettagli, utilizzare man prelink.
|
Incrementare le Prestazioni di KDE dopo il Prelinkings
Dopo il prelinking è possibile ridurre il tempo di caricamento di KDE. Se KDE
rileva di essere stato prelinkato allora disabiliterà il caricamento di
kdeinit (visto che non è più necessario) con un incremento delle sue
prestazioni.
Per fare in modo che KDE rilevi il prelinking impostare
KDE_IS_PRELINKED="true" in /etc/env.d/99kde-env.
4.Problemi Noti e Soluzioni
"Impossibile prelinkare con librerie condivise non-PIC"
La causa di questo problema è l'errata compilazione di librerie condivise, senza
l'opzione -fPIC di gcc per tutti i relativi file oggetto.
Qui ci sono le librerie che non sono state corrette o non possono essere
corrette:
-
Le librerie nel pacchetto wine, incluso winex. Il prelinking
non velocizzerebbe comunque gli eseguibili MS Windows.
-
Le librerie in media-video/mjpegtools,
/usr/lib/liblavfile-1.6.so.0.
Se le librerie che danno problemi non sono elencate, segnalale e allega,
preferibilmente, una patch per aggiungere -fPIC alle relative CFLAGS.
Quando prelinko il mio sistema alcuni binari statici non funzionano
più
Quando si ha a che fare con le glibc, non si ottiene mai un binario statico al
100%. Anche se si compila staticamente un binario con glibc, potrebbe ancora
dipendere da altri file di sistema. Ecco una spiegazione di Dick Howell,
"Generalmente si presuppone che tutto il necessario sia contenuto nel
file scaricato, in modo che l'applicazione non dipenda da librerie installate
sul sistema locale. Sfortunatamente in Linux, e credo in qualsiasi altro
sistema usi le glibc, ciò non è del tutto vero. Ad esempio "libnss" (name
service switch, chiamata da alcuni network security system), che fornisce
delle funzioni per accedere a diversi database per l'autenticazione,
informazioni di rete ed altro, dovrebbe creare applicazioni indipendenti
dall'effettivo ambiente di rete di una macchina. Una bella idea, ma modifiche
alle glibc possono generare problemi nel tentativo di caricarla. E non è
possibile linkare staticamente "libnss", poiché è configurata per ogni
macchina individualmente. Credo che il problema derivi principalmente dal
linkare staticamente altre librerie glibc, in particolare "libpthread", "libm"
e "libc", da cui provengono chiamate incompatibili a funzioni di
"libnss"."
Prelink si blocca con l'errore "prelink: dso.c:306: fdopen_dso:
Assertion
`j == k' failed."
Questo problema è noto e ben documentato qui. Prelink non
funziona con eseguibili compressi in formato UPX. Per ora (prelink-20021213) non
esiste alcuna soluzione eccetto quella di nascondere a prelink gli eseguibili in
questione. Leggi la sezione Configurazione
per sapere come farlo facilmente.
Uso grsecurity e sembra che il prelinking non funzioni.
Per prelinkare su un sistema con grsecurity che utilizza chiamate mmap() casuali
è necessario disattivare "randomized mmap() base" per
/lib/ld-2.3.*.so. Per fare ciò, utilizzare il tool chpax
quando tali file non sono in uso (ad esempio, facendo il boot da un CD di
ripristino).
5.Conclusioni
Il prelinking può velocizzare notevolmente il tempo di avvio di numerose
applicazioni complesse e portage supporta nativamente questa tecnologia. Inoltre
il prelinking è sicuro, perché è sempre possibile annullarlo per i binari che
presentano problemi. Ricorda che, se le glibc o altre librerie prelinkate
vengono aggiornate, è necessario eseguire nuovamente prelink! Buona
fortuna!
|