Gentoo Logo

Ghid Prelink pentru Gentoo Linux

Conţinut:

1.  Introducere

Ce este Prelink şi cum mă poate ajuta?

Multe aplicaţii folosesc biblioteci partajate. Aceste biblioteci partajate trebuiesc încărcate în memorie la execuţie şi diferitele referinţe simbolice trebuie rezolvate. Pentru majoritatea programelor mici acest proces de link dinamic este foarte rapid. Totuşi, pentru unele programe scrise în C++ şi care au multe dependinţe de biblioteci, procesul de link dinamic poate dura o perioadă semnificativă de timp.

Pe majoritatea sistemelor, bibliotecile nu sunt schimbate foarte des şi, când un program este rulat, operaţiile de link sunt aceleaşi de fiecare dată. Prelink-ul se foloseşte de asta executând procesul de link şi stocându-l în executabil.

Prelinking-ul poate să reducă timpul de pornire al aplicaţiilor. De exemplu, timpul de încărcare al unui program tipic KDE poate fi redus până la 50%. Singura operaţie necesară este re-rularea prelink-ului pentru executabil de fiecare dată când o bibliotecă este actualizată.

Atenţie: Prelink nu va funcţiona cu Hardened Gentoo. Aceasta, pentru că ambele proiecte încearcă să modifice asocierea spaţiului de adresare a bibliotecilor partajate. Însă prelink, cu opţiunea -R, amestecă în mod aleator adresele de bază ale bibliotecilor, oferind un anume grad de protecţie securizată.

Sumar

  • Prelinking-ul este executat de un program numit, surprinzator, prelink. Acesta modifică fişierul binar pentru a-l face să pornească mai repede.
  • Dacă bibliotecile de care este dependentă o aplicaţie se schimbă după prelink, procesul de prelink trebuie repetat, altfel avantajul vitezei este pierdut. Cu alte cuvinte, de fiecare dată când portage actualizează bibliotecile, prelink-ul trebuie repetat.
  • Schimbarea fişierului binar este în întregime reversibilă. prelink are o funcţie de refacere (undo).
  • Versiunile noi de Portage pot să gestioneze, prin prelink, sumele MD5 schimbate şi timpii de modificare (mtime) pentru fişierele binare.
  • Nu este necesar să setaţi FEATURES="prelink" în fişierul dvs. make.conf; Portage va suporta automat prelink dacă va găsi binarul prelink.

2.  Configurarea Prelink

Instalarea programelor

Mai întâi, trebuie să instalaţi utilitarul prelink. Procesul de instalare verifică automat dacă sistemul poate să efectueze procesul de prelink în siguranţă.

Cod 2.1: Instalarea prelink

# emerge prelink

Multe persoane primesc erori la instalarea prelink deoarece testele eşuează. Testele există din motive de securitate -- comportamentul lui prelink este nedefinit dacă le dezactivaţi. Erorile aparute la instalare sunt, de obicei, dependente doar de pachetele de bază; binutils, gcc, şi glibc. Încercaţi să le reinstalaţi pe fiecare în ordine.

Notă: Sugestie: Dacă primiţi o eroare, încearcaţi să compilaţi şi să testaţi prelink manual (./configure ; make ; make check ). În cazul unei erori, analizaţi fişierele *.log din directorul de test. Acestea vă pot oferi indicii utile.

Dacă deţineţi un set de paşi care reproduc eroarea cauzată de emerge pe un alt sistem, vă rugăm trimiteţi-le lui Stefan Jones.

Pregătirea Sistemului Dvs.

De asemenea, asiguraţi-vă că nu aveţi setată -fPIC între opţiunile dvs. CFLAGS/CXXFLAGS. Dacă o aveţi setată, va trebui să vă recompilaţi întregul sistem fără aceasta.

Configurarea

Rularea env-update va genera fişierul /etc/prelink.conf care îi specifică aplicaţiei prelink pentru ce fişiere să realizeze prelink.

Cod 2.2: Rularea env-update

# env-update

Din păcate nu puteţi să utilizaţi prelink pentru fişiere care au fost compilate de versiuni vechi de binutils. Multe dintre aceste aplicaţii vin cu pachete precompilate care sunt instalate în /opt. Fişierul următor va specifica aplicaţiei prelink să nu încerce să le modifice.

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

PRELINK_PATH_MASK="/opt"

Notă: Puteţi adăuga mai multe directoare la listă, separate prin doua puncte ( : ).

3.  Procesul de prelink

Utilizarea prelink

Se foloseşte următoarea comandă pentru a rula prelink pe toate fişierele binare din directoarele precizate în /etc/prelink.conf.

Cod 3.1: Prelinking pentru fişierele din listă

# prelink -amR

Atenţie: S-a observat că procesul de prelink al întregului sistem atunci când există puţin spaţiu liber pe disc poate să truncheze fişierele binare. Rezultatul este un sistem stricat. Folosiţi comanda file sau readelf pentru a verifica starea unui fişier binar. O altă variantă este să verificaţi înainte cât spaţiu liber este disponibil pe disc cu comanda df -h.

Explicaţia opţiunilor:
-a "All": prelink pentru toate fişierele binare
-m Conservă spaţiul de memorie virtuală. Necesar dacă aveţi multe biblioteci care trebuie prelink-ate.
-R Random (aleator) -- distribuie aleator ordinea adreselor. Aceasta măreşte securitatea împotriva depăşirilor de buffer.

Notă: Pentru mai multe optiuni şi detalii puteţi consulta man prelink.

Acţiunea de Cron Prelink

Versiunea sys-devel/prelink-20060213 şi cele ulterioare, instalează o acţiune de cron în /etc/cron.daily/prelink. Pentru a o activa, editaţi fişierul de configurare /etc/conf.d/prelink. Aceasta va rula prelink zilnic în fundal, ajutându-vă să nu mai introduceţi comanda manual.

Mărirea Vitezei KDE După Prelink

Timpul de încărcare al KDE poate fi redus mult după operaţia de prelink. Dacă informaţi KDE de faptul că i-a fost aplicat prelink, va dezactiva încărcarea aplicaţiei kdeinit (doarece nu mai este necesară), fapt care măreşte viteza de încărcare şi mai mult.

Setaţi KDE_IS_PRELINKED="true" în /etc/env.d/99kde-env pentru a informa KDE despre prelink.

4.  Probleme cunoscute şi rezolvări

"Cannot prelink against non-PIC shared library"

Cauza acestei probleme sunt bibliotecile partajate prost compilate, fără opţiunea gcc -fPIC pentru toate fişierele lor obiect.

Acestea sunt bibliotecile care nu au fost sau nu pot fi reparate:

  • Bibliotecile din pachetul wine, inclusiv winex. Prelinking-ul nu ar accelera executabilele MS Windows în nici un fel.
  • Biblioteca din media-video/mjpegtools, /usr/lib/liblavfile-1.6.so.0.
  • Bibliotecile OpenGl de la Nvidia, /usr/lib/opengl/nvidia/lib/libGL.so.*. Din motive de performanţă, acestea a fost compilate fără suport PIC.

Dacă biblioteca cu care aveţi probleme nu a fost menţionată, vă rugăm să trimiteţi un raport, preferabil cu un patch, care să adauge -fPIC la indicatorii CFLAGS relevanţi.

Când folosesc prelink pe sistemul meu, unele fişiere binare statice nu mai funcţionează

Unde este implicat glibc, nu exista fişiere binare 100% statice. Dacă compilaţi un fişier binar cu glibc, acesta poate în continuare să depindă de alte fişiere sistem. Mai jos este o explicaţie de Dick Howell,

"Presupun că ideea este că totul va fi în fişierul descărcat, aşa că nimic nu depinde de bibliotecile locale de pe sistemul destinaţie. Din păcate, în Linux şi cred că în orice altceva care foloseşte GLIBC, acest lucru nu este adevărat. Exista acest "libnss" (name service switch, unii oameni îl numesc network security system - sistem de securitate al reţelei) care oferă funcţii pentru accesarea diferitelor baze de date pentru autentificare, informaţie despre reţea şi alte lucruri. Acesta se presupune că face aplicaţiile să fie independente de setările reale de reţea ale maşinii, care sunt configurate separat. Ideea este buna, dar schimbarile in GLIBC pot conduce la probleme la încărcarea libnss. Şi nu se poate să faci linking static pentru libnss deoarece este configurat individual pentru fiecare maşină. Problema apare, cred, în principal de la linking-ul static al altor biblioteci GLIBC, în principal "libpthread", "libm" şi "libc", din care provin apeluri incompatibile către funcţii "libnss"."

Prelink se opreşte cu "prelink: dso.c:306: fdopen_dso: Assertion `j == k' failed."

Aceasta este o problemă cunoscută, diagnosticată aici. Prelink nu poate să lucreze cu executabile comprimate cu UPX. Începând cu prelink-20021213 nu există nici o soluţie în afară de a ascunde executabilele când foloseşti prelink. Vezi secţiunea despre configurare de mai sus pentru un mod simplu de a face asta.

Folosesc grsecurity şi se pare că prelinking-ul nu funcţionează.

Pentru a folosi prelink pe un sistem cu grsecurity care foloseşte o bază aleatoare mmap(), este necesar să opriţi "randomized mmap() base" pentru /lib/ld-2.3.*.so. Puteţi să efectuaţi această operaţie cu utilitarul chpax, dar doar atunci când fişierul nu este folosit (de exemplu, bootând de pe un CD).

5.  Concluzie

Prelinking-ul poate să scadă drastic timpii de pornire pentru un număr de aplicaţii mari. Suport pentru prelinking exista în Portage. Prelinking-ul este sigur pentru că este întotdeauna posibil să anulaţi schimbările pentru orice fişier binar dacă întâmpinaţi probleme. Ţine în minte că, de fiecare dată când actualizaţi glibc sau alte biblioteci pe care le-aţi folosit pentru prelinking, trebuie să rulaţi prelink! Pe scurt, succes!



Imprimare

Actualizat la 21 Aprilie 2006

Versiunea originală a acestui document a fost actualizată ultima dată la 12 Ianuarie 2010

Sumar: Acest ghid explică utilizarea suportului pentru prelink în portage 2.0.46 sau mai nou.

Stefan Jones
Autor

John P. Davis
Editor

Jorge Paulo
Editor

Sven Vermeulen
Editor

Erwin
Editor

Tiberiu Ana
Translator

Donate to support our development efforts.

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