Gentoo Linux Prelink Guide

Contenuti:

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!



Ultimo aggiorn.:
2005-04-21
Stefan Jones
Autore

John P. Davis
Redazione

Jorge Paulo
Redazione

Sven Vermeulen
Redazione

Erwin
Redazione

Gilberto De Faveri
Traduzione

Massimo Canali
Revisione

Sommario:  Questa guida documenta come utilizzare il supporto al prelink in portage 2.0.46 e successivi.
- 2002 Gentoo.it - Domande, commenti e/o correzioni? Email gentoo-dev@gentoo.it.