Provided by: manpages-ro_4.27.0-1_all 

NUME
ld.so, ld-linux.so - editor de legături/încărcător dinamic
SINOPSIS
Editorul de legături dinamice poate fi rulat fie indirect, prin rularea unui program legat dinamic sau a
unui obiect partajat (caz în care nu pot fi transmise opțiuni din linia de comandă către editorul de
legături dinamice și, în cazul ELF, este executat editorul de legături dinamice care este stocat în
secțiunea .interp a programului), fie direct, prin rularea:
/lib/ld-linux.so.* [OPȚIUNI] [PROGRAM [ARGUMENTE]]
DESCRIERE
Programele ld.so și ld-linux.so* găsesc și încarcă obiectele partajate (biblioteci partajate) necesare
unui program, pregătesc programul pentru execuție și apoi îl execută.
Binarele Linux necesită legare dinamică (legare în timpul execuției), cu excepția cazului în care
opțiunea -static a fost dată la ld(1) în timpul compilării.
Programul ld.so gestionează binarele a.out, un format binar utilizat cu mult timp în urmă. Programul
ld-linux.so* (/lib/ld-linux.so.1 pentru libc5, /lib/ld-linux.so.2 pentru glibc2) gestionează binarii care
sunt în formatul ELF mai modern. Ambele programe au același comportament și utilizează aceleași fișiere
și programe de suport (ldd(1), ldconfig(8) și /etc/ld.so.conf).
La rezolvarea dependențelor obiectelor partajate, editorul de legături dinamice inspectează mai întâi
fiecare șir de dependențe pentru a vedea dacă acesta conține o bară oblică (acest lucru se poate întâmpla
dacă un nume de rută al unui obiect partajat care conține bară oblică a fost specificat la momentul
realizării legăturii). Dacă se găsește o bară oblică, atunci șirul de dependență este interpretat ca un
nume de rută (relativ sau absolut), iar obiectul partajat este încărcat folosind acel nume de rută.
Dacă o dependență de obiect partajat nu conține o bară oblică, atunci este căutată în următoarea ordine:
(1) Utilizând directoarele specificate în atributul DT_RPATH al secțiunii dinamice a binarului, dacă
este prezent și atributul DT_RUNPATH nu există.
(2) Utilizând variabila de mediu LD_LIBRARY_PATH, cu excepția cazului în care executabilul este rulat în
modul de execuție-securizată (a se vedea mai jos), caz în care această variabilă este ignorată.
(3) Utilizând directoarele specificate în atributul DT_RUNPATH al secțiunii dinamice a binarului, dacă
este prezent. Aceste directoare sunt căutate numai pentru a găsi obiectele solicitate de intrările
DT_NEEDED (dependențe directe) și nu se aplică copiilor acelor obiecte, care trebuie să aibă
propriile lor intrări DT_RUNPATH. Acest lucru este diferit de DT_RPATH, care se aplică căutărilor
pentru toți copiii din arborele de dependențe.
(4) Din fișierul cache /etc/ld.so.cache, care conține o listă compilată de obiecte partajate candidate
găsite anterior în ruta bibliotecii augmentate. Dacă, totuși, binarul a fost legat cu opțiunea
editorului de legături -z nodefaultlib, obiectele partajate din rutele implicite sunt ignorate.
Obiectele partajate instalate în directoarele de capacități hardware (a se vedea mai jos) sunt
preferate altor obiecte partajate.
(5) În ruta implicită /lib, și apoi /usr/lib; (pe unele arhitecturi pe 64 de biți, rutele implicite
pentru obiectele partajate pe 64 de biți sunt /lib64, și apoi /usr/lib64). Dacă binarul a fost legat
cu opțiunea editorului de legături -z nodefaultlib, acest pas este sărit.
Simboluri dinamice de șir
În numeroase locuri, editorul de legături dinamice extinde simbolurile șirurilor dinamice:
• În variabilele de mediu LD_LIBRARY_PATH, LD_PRELOAD și LD_AUDIT,
• în interiorul valorilor etichetelor de secțiune dinamică DT_NEEDED, DT_RPATH, DT_RUNPATH, DT_AUDIT și
DT_DEPAUDIT ale binarelor ELF,
• în argumentele opțiunilor de linie de comandă ld.so --audit, --library-path și --preload (a se vedea
mai jos), și
• în argumentele de nume de fișier pentru funcțiile dlopen(3) și dlmopen(3).
Simbolurile substituite sunt următoarele:
$ORIGIN (sau echivalent ${ORIGIN})
Aceasta se extinde la directorul care conține programul sau obiectul partajat. Astfel, o aplicație
localizată în vreun-dir/aplicație ar putea fi compilată cu
gcc -Wl,-rpath,'$ORIGIN/../lib'
astfel încât să găsească un obiect partajat asociat în vreun-dir/bibliotecă indiferent unde se
află vreun-dir în ierarhia directoarelor. Acest lucru facilitează crearea de aplicații „la cheie”
care nu trebuie să fie instalate în directoare speciale, ci pot fi despachetate în orice director
și își pot găsi în continuare propriile obiecte partajate.
$LIB (sau echivalent ${LIB})
Aceasta se extinde la lib sau lib64 în funcție de arhitectură (de exemplu, pe x86-64, se extinde
la lib64 și pe x86-32, se extinde la lib).
$PLATFORM (sau echivalent ${PLATFORM})
Acesta se extinde la un șir corespunzător tipului de procesor al sistemului gazdă (de exemplu,
„x86_64”). Pe unele arhitecturi, nucleul Linux nu furnizează un șir de platformă pentru editorul
de legături dinamice. Valoarea acestui șir este preluată din valoarea AT_PLATFORM din vectorul
auxiliar (consultați getauxval(3)).
Rețineți că simbolurile de șir dinamice trebuie să fie citate corespunzător atunci când sunt definite
dintr-un shell, pentru a preveni extinderea lor ca variabile de shell sau de mediu.
OPȚIUNI
--argv0 șir (începând cu glibc 2.33)
Stabilește argv[0] la valoarea șir înainte de a rula programul.
--audit listă
Utilizează obiectele numite în listă ca auditori. Obiectele din listă sunt delimitate prin două
puncte.
--glibc-hwcaps-mask listă
Caută subdirectoare încorporate numai dacă sunt în listă.
--glibc-hwcaps-prepend listă
Caută subdirectoarele glibc-hwcaps din listă.
--inhibit-cache
Nu utilizează /etc/ld.so.cache.
--library-path ruta
Utilizează ruta în locul valorii variabilei de mediu LD_LIBRARY_PATH (a se vedea mai jos). Numele
ORIGIN, LIB și PLATFORM sunt interpretate ca pentru variabila de mediu LD_LIBRARY_PATH.
--inhibit-rpath listă
Ignoră informațiile RPATH și RUNPATH în numele obiectelor din listă. Această opțiune este ignorată
la rularea în modul de execuție securizată (a se vedea mai jos). Obiectele din listă sunt
delimitate prin două puncte („:”) sau spații.
--list Listează toate dependențele și modul în care acestea sunt rezolvate.
--list-diagnostics (începând cu glibc 2.33)
Imprimă informații de diagnosticare a sistemului într-un format care poate fi citit de mașină, cum
ar fi unele variabile interne ale încărcătorului, vectorul auxiliar (vezi getauxval(3)) și
variabilele de mediu. Pe unele arhitecturi, comanda poate afișa informații suplimentare (cum ar fi
caracteristicile cpu utilizate în selectarea indirectă a funcțiilor GNU pe x86). --list-tunables
(de la glibc 2.33) Imprimă numele și valorile tuturor variabilelor de ajustare, împreună cu
valorile minime și maxime permise.
--preload list (începând cu glibc 2.30)
Preîncarcă obiectele specificate în listă. Obiectele din listă sunt delimitate prin două puncte
(„:”) sau spații. Obiectele sunt preîncărcate după cum se explică în descrierea variabilei de
mediu LD_PRELOAD de mai jos.
Spre deosebire de LD_PRELOAD, opțiunea --preload oferă o modalitate de a efectua preîncărcarea
pentru un singur executabil fără a afecta preîncărcarea efectuată în orice proces copil care
execută un program nou.
--verify
Verificați dacă programul este legat dinamic și dacă acest editor de legături dinamice îl poate
gestiona.
MEDIU
Diverse variabile de mediu influențează funcționarea editorului de legături dinamice.
Modul de „execuție securizată”
Din motive de securitate, în cazul în care editorul de legături dinamice stabilește că un binar ar trebui
să fie executat în modul de execuție securizat, efectele anumitor variabile de mediu sunt anulate sau
modificate și, în plus, aceste variabile de mediu sunt eliminate din mediu, astfel încât programul nici
măcar nu vede definițiile. Unele dintre aceste variabile de mediu afectează funcționarea editorului de
legături dinamice în sine și sunt descrise mai jos. Alte variabile de mediu tratate în acest mod includ:
GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LD_AUDIT, LD_DEBUG, LD_DEBUG_OUTPUT, LD_DYNAMIC_WEAK,
LD_HWCAP_MASK, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_PRELOAD, LD_PROFILE, LD_SHOW_AUXV, LOCALDOMAIN,
LOCPATH, MALLOC_TRACE, NIS_PATH, NLSPATH, RESOLV_HOST_CONF, RES_OPTIONS, TMPDIR și TZDIR.
Un binar este executat în modul de execuție-securizată dacă intrarea AT_SECURE din vectorul auxiliar (a
se vedea getauxval(3)) are o valoare diferită de zero. Această intrare poate avea o valoare diferită de
zero din diverse motive, inclusiv:
• ID-urile de utilizator reale și efective ale procesului diferă, sau ID-urile de grup reale și efective
diferă. Acest lucru se întâmplă de obicei ca urmare a executării unui program set-user-ID sau
set-group-ID.
• Un proces cu un ID de utilizator non-root a executat un binar care a conferit capacități procesului.
• Este posibil ca o valoare diferită de zero să fi fost definită de un modul de securitate Linux.
Variabile de mediu
Unele dintre cele mai importante variabile de mediu sunt următoarele:
LD_ASSUME_KERNEL (de la glibc 2.2.3 la glibc 2.36)
Fiecare obiect partajat poate informa editorul de legături dinamice cu privire la versiunea ABI
minimă a nucleului de care are nevoie. (Această cerință este codificată într-o secțiune de notă
ELF care poate fi vizualizată prin readelf -n ca o secțiune etichetată NT_GNU_ABI_TAG). În
momentul rulării, editorul de legături dinamice determină versiunea ABI a nucleului care rulează
și va respinge încărcarea obiectelor partajate care specifică versiuni ABI minime care depășesc
acea versiune ABI.
LD_ASSUME_KERNEL poate fi utilizată pentru a determina editorul de legături dinamice să presupună
că rulează pe un sistem cu o versiune ABI de nucleu diferită. De exemplu, următoarea linie de
comandă determină editorul de legături dinamice să presupună că rulează pe Linux 2.2.5 atunci când
încarcă obiectele partajate solicitate de prog-meu:
$ LD_ASSUME_KERNEL=2.2.5 ./prog-meu
Pe sistemele care furnizează mai multe versiuni ale unui obiect partajat (în directoare diferite
în ruta de căutare) care au cerințe diferite privind versiunea ABI minimă a nucleului,
LD_ASSUME_KERNEL poate fi utilizată pentru a selecta versiunea obiectului care este utilizată (în
funcție de ordinea de căutare în directoare).
Din punct de vedere istoric, cea mai frecventă utilizare a caracteristicii LD_ASSUME_KERNEL a fost
selectarea manuală a implementării mai vechi a firelor POSIX LinuxThreads pe sistemele care
ofereau atât LinuxThreads, cât și NPTL (aceasta din urmă era de obicei opțiunea implicită pe
astfel de sisteme); consultați pthreads(7).
LD_BIND_NOW (începând cu glibc 2.1.1)
Dacă este definită la un șir de caractere nevid, determină editorul de legături dinamice să
rezolve toate simbolurile la pornirea programului, în loc să amâne rezolvarea apelurilor de
funcții până în momentul în care acestea sunt referite pentru prima dată. Acest lucru este util
atunci când se utilizează un depanator.
LD_LIBRARY_PATH
O listă de directoare în care să se caute biblioteci ELF la momentul execuției. Elementele din
listă sunt separate fie prin două puncte, fie prin punct și virgulă, și nu există suport pentru
eludarea niciunui separator. Un nume de director de lungime zero indică directorul de lucru
curent.
Această variabilă este ignorată în modul de execuție-securizată.
În cadrul numelor de rute specificate în LD_LIBRARY_PATH, editorul de legături dinamice extinde
simbolurile $ORIGIN, $LIB și $PLATFORM (sau versiunile care utilizează acolade în jurul numelor)
așa cum este descris mai sus în secțiunea Simboluri dinamice de șir. Astfel, de exemplu, următorul
text ar face ca o bibliotecă să fie căutată fie în subdirectorul lib, fie în subdirectorul lib64
de sub directorul care conține programul care urmează să fie executat:
$ LD_LIBRARY_PATH='$ORIGIN/$LIB' prog
Observați utilizarea ghilimelelor simple, care împiedică extinderea $ORIGIN și $LIB ca variabile
shell!
LD_PRELOAD
O listă de obiecte partajate ELF suplimentare, specificate de utilizator, care urmează să fie
încărcate înaintea tuturor celorlalte. Această caracteristică poate fi utilizată pentru a
suprascrie selectiv funcții din alte obiecte partajate.
Elementele din listă pot fi separate prin spații sau două puncte și nu există suport pentru
eludarea niciunui separator. Obiectele sunt căutate folosind regulile prezentate în secțiunea
DESCRIERE. Obiectele sunt căutate și adăugate la tabelul de legături în ordinea de la stânga la
dreapta specificată în listă.
În modul de execuție securizată, numele de rute de preîncărcare care conțin bare oblice (slashes)
sunt ignorate. În plus, obiectele partajate sunt preîncărcate numai din directoarele de căutare
standard și numai dacă bitul de mod set-user-ID este activat (ceea ce nu este tipic).
În cadrul numelor specificate în lista LD_PRELOAD, editorul de legături dinamice înțelege
simbolurile $ORIGIN, $LIB și $PLATFORM (sau versiunile care utilizează acolade în jurul numelor),
astfel cum sunt descrise mai sus în Simboluri dinamice de șir; (a se vedea, de asemenea, discuția
despre punerea între ghilimele în cadrul descrierii lui LD_LIBRARY_PATH).
Există diferite metode de specificare a bibliotecilor care urmează să fie preîncărcate, iar
acestea sunt tratate în următoarea ordine:
(1) Variabila de mediu LD_PRELOAD.
(2) Opțiunea de linie de comandă --preload la apelarea directă a editorului de legături dinamice.
(3) Fișierul /etc/ld.so.preload (descris mai jos).
LD_TRACE_LOADED_OBJECTS
Dacă este definită (la orice valoare), face ca programul să își listeze dependențele dinamice, ca
și cum ar fi rulat de ldd(1), în loc să ruleze normal.
Apoi, există o mulțime de variabile mai mult sau mai puțin obscure, multe învechite sau doar pentru uz
intern.
LD_AUDIT (începând cu glibc 2.4)
O listă de obiecte ELF partajate, specificate de utilizator, care urmează să fie încărcate
înaintea tuturor celorlalte într-un spațiu de nume separat al editorului de legături (de exemplu,
unul care nu intervine în legăturile normale de simboluri care ar apărea în proces) Aceste obiecte
pot fi utilizate pentru a verifica funcționarea editorului de legături dinamice. Elementele din
listă sunt separate prin două puncte și nu există suport pentru eludarea separatorului.
LD_AUDIT este ignorată în modul de execuție-securizată.
Editorul de legături dinamice va notifica obiectele partajate de audit la așa-numitele puncte de
control de audit - de exemplu, încărcarea unui nou obiect partajat, rezolvarea unui simbol sau
apelarea unui simbol dintr-un alt obiect partajat - prin apelarea unei funcții corespunzătoare în
cadrul obiectului partajat de audit. Pentru detalii, consultați rtld-audit(7). Interfața de audit
este în mare parte compatibilă cu cea furnizată pe Solaris, așa cum este descrisă în Linker and
Libraries Guide, în capitolul Runtime Linker Auditing Interface.
În cadrul numelor specificate în lista LD_AUDIT, editorul dinamic înțelege simbolurile $ORIGIN,
$LIB și $PLATFORM (sau versiunile care utilizează acolade în jurul numelor), astfel cum sunt
descrise mai sus în Simboluri de șir dinamice; (a se vedea, de asemenea, discuția despre punerea
între ghilimele în cadrul descrierii lui LD_LIBRARY_PATH).
Începând cu glibc 2.13, în modul de execuție securizată, numele din lista de audit care conțin
bare oblice sunt ignorate și sunt încărcate numai obiectele partajate din directoarele de căutare
standard care au bitul de mod set-user-ID activat.
LD_BIND_NOT (începând cu glibc 2.1.95)
Dacă această variabilă de mediu este stabilită la un șir nevid, nu se actualizează GOT („global
offset table”, tabelul de poziții globale) și PLT („procedure linkage table”, tabelul de legături
al procedurilor) după rezolvarea unui simbol de funcție. Prin combinarea utilizării acestei
variabile cu LD_DEBUG (cu categoriile bindings și symbols), se pot observa toate legăturile de
funcții în timpul execuției.
LD_DEBUG (începând cu glibc 2.1)
Afișează informații de depanare detaliate despre funcționarea editorului de legături dinamice.
Conținutul acestei variabile este una sau mai multe dintre următoarele categorii, separate prin
două puncte, virgule sau (dacă valoarea este între ghilimele) spații:
help Specificând help în valoarea acestei variabile nu se execută programul specificat și
se afișează un mesaj de ajutor despre categoriile care pot fi specificate în această
variabilă de mediu.
all Imprimă toate informațiile de depanare (cu excepția statistics și unused; a se vedea
mai jos).
bindings Afișează informații despre definiția la care este legat fiecare simbol.
files Afișează progresul pentru fișierul de intrare.
libs Afișează rutele de căutare a bibliotecii.
reloc Afișează procesarea realocării.
scopes Afișează informații despre domeniul de aplicare.
statistics Afișează statisticile privind realocarea.
symbols Afișați rutele de căutare pentru fiecare simbol căutat.
unused Determină DSO-urile neutilizate.
versions Afișează dependențele de versiune.
Începând cu glibc 2.3.4, LD_DEBUG este ignorată în modul de execuție-securizată, cu excepția
cazului în care există fișierul /etc/suid-debug (conținutul fișierului este irelevant).
LD_DEBUG_OUTPUT (începând cu glibc 2.1)
În mod implicit, rezultatul LD_DEBUG este scris la ieșirea de eroare standard. Dacă
LD_DEBUG_OUTPUT este definită, atunci rezultatul este scris în numele de rută specificat de
valoarea sa, cu sufixul „.” (punct) urmat de ID-ul procesului anexat la numele de rută.
LD_DEBUG_OUTPUT este ignorată în modul de execuție-securizată.
LD_DYNAMIC_WEAK (începând cu glibc 2.1.91)
În mod implicit, atunci când caută în bibliotecile partajate pentru a rezolva o referință de
simbol, editorul de legături dinamice va rezolva la prima definiție pe care o găsește.
Versiunile vechi ale glibc (înainte de glibc 2.2) aveau un comportament diferit: dacă editorul de
legături găsea un simbol slab, acesta reținea acel simbol și continua să caute în bibliotecile
partajate rămase. Dacă, ulterior, se găsea o definiție puternică a aceluiași simbol, atunci se
folosea în schimb acea definiție; (dacă nu mai găsește niciun alt simbol, atunci editorul de
legături dinamice utilizează simbolul slab pe care l-a găsit inițial).
Comportamentul vechi al glibc nu era standard; (practica standard este că distincția dintre
simbolurile slabe și puternice ar trebui să aibă efect numai la momentul legăturii statice). În
glibc 2.2, editorul de legături dinamice a fost modificat pentru a oferi comportamentul actual
(care era comportamentul oferit de majoritatea celorlalte implementări la acel moment).
Definirea variabilei de mediu LD_DYNAMIC_WEAK (cu orice valoare) oferă vechiul comportament
(nestandardizat) al glibc, prin care un simbol slab dintr-o bibliotecă partajată poate fi anulat
de un simbol puternic descoperit ulterior într-o altă bibliotecă partajată. Rețineți că, chiar și
atunci când această variabilă este definită, un simbol puternic dintr-o bibliotecă partajată nu va
trece peste o definiție slabă a aceluiași simbol din programul principal.
Începând cu glibc 2.3.4, LD_DYNAMIC_WEAK este ignorată în modul de execuție-securizată.
LD_HWCAP_MASK (de la glibc 2.1la glibc 2.38)
Mască pentru capacitățile hardware. Începând cu glibc 2.26, opțiunea poate fi ignorată dacă glibc
nu acceptă „tunables” (ajustări).
LD_ORIGIN_PATH (începând cu glibc 2.1)
Ruta în care se găsește binarul.
Începând cu glibc 2.4, LD_ORIGIN_PATH este ignorată în modul de execuție-securizată.
LD_POINTER_GUARD (de la glibc 2.4 la glibc 2.22)
Stabiliți valoarea 0 pentru a dezactiva protecția indicatorului. Orice altă valoare activează
protecția indicatorilor, care este și valoarea implicită. Protejarea indicatorilor este un
mecanism de securitate prin care unii indicatori de cod stocați în memoria programului în care se
poate scrie (adresele de retur salvate de setjmp(3) sau indicatorii de funcție utilizați de
diverse funcții interne ale glibc) sunt modificați în mod semialeatoriu pentru a face mai dificil
pentru un atacator să deturneze indicatorii pentru a fi utilizați în cazul unui atac de tip
„buffer overrun” (debordarea memoriei tampon) sau „stack-smashing” (zdrobirea stivelor). Începând
cu glibc 2.23, LD_POINTER_GUARD nu mai poate fi utilizat pentru a dezactiva protecția pointerilor,
care este acum întotdeauna activată.
LD_PROFILE (începând cu glibc 2.1)
Numele unui (singur) obiect partajat care urmează să fie profilat, specificat fie ca nume de rută,
fie ca un soname. Rezultatul profilării este anexat la fișierul al cărui nume este:
$LD_PROFILE_OUTPUT/$LD_PROFILE.profile.
Începând cu glibc 2.2.5, LD_PROFILE utilizează o rută implicită diferită în modul de
execuție-securizată.
LD_PROFILE_OUTPUT (începând cu glibc 2.1)
Directorul în care ar trebui să fie scrisă ieșirea LD_PROFILE. Dacă această variabilă nu este
definită sau este definită ca un șir gol, atunci valoarea implicită este /var/tmp.
LD_PROFILE_OUTPUT este ignorată în modul de execuție-securizată; în schimb, /var/profile este
utilizat întotdeauna.
LD_SHOW_AUXV (începând cu glibc 2.1)
Dacă această variabilă de mediu este definită (cu orice valoare), se afișează matricea auxiliară
transmisă de nucleu (a se vedea și getauxval(3)).
Începând cu glibc 2.3.4, LD_SHOW_AUXV este ignorată în modul de execuție-securizată.
LD_TRACE_PRELINKING (de la glibc 2.4 la glibc 2.35)
Dacă această variabilă de mediu este definită, urmărește pre-legătura obiectului al cărui nume
este atribuit acestei variabile de mediu; (utilizați ldd(1) pentru a obține o listă a obiectelor
care pot fi urmărite). Dacă numele obiectului nu este recunoscut, atunci este urmărită toată
activitatea de pre-legare.
LD_USE_LOAD_BIAS (de la glibc 2.3.3 la glibc 2.35)
În mod implicit (și anume, dacă această variabilă nu este definită), executabilele și obiectele
partajate pre-legate vor onora adresele de bază ale obiectelor partajate dependente, iar
executabilele (ne=pre-legate) independente de poziție (PIE) și alte obiecte partajate nu le vor
onora. Dacă LD_USE_LOAD_BIAS este definită cu valoarea 1, atât executabilele, cât și PIE-urile vor
onora adresele de bază. Dacă LD_USE_LOAD_BIAS este definită cu valoarea 0, nici executabilele,
nici PIE-urile nu vor respecta adresele de bază.
Începând cu glibc 2.3.3, această variabilă este ignorată în modul de execuție-securizată.
LD_VERBOSE (începând cu glibc 2.1)
Dacă este definită la un șir de caractere nevid, furnizează informații despre versiunile
simbolurilor despre program dacă a fost definită variabila de mediu LD_TRACE_LOADED_OBJECTS.
LD_WARN (începând cu glibc 2.1.3)
Dacă este definită la un șir nevid, avertizează cu privire la simbolurile nerezolvate.
LD_PREFER_MAP_32BIT_EXEC (doar x86-64; începând cu glibc 2.23)
Conform ghidului de optimizare a software-ului Intel Silvermont, pentru aplicațiile pe 64 de biți,
performanța de predicție a ramificării poate fi afectată negativ atunci când ținta unei ramificări
se află la o distanță mai mare de 4 Go de ramificare. Dacă această variabilă de mediu este
definită (la orice valoare), editorul de legături dinamice va încerca mai întâi să cartografieze
paginile executabile utilizând fanionul mmap(2) MAP_32BIT și va reveni la cartografierea fără
acest fanion dacă încercarea eșuează. NB: MAP_32BIT va face cartografierea către cei 2 Go (nu
4 Go) ai spațiului de adrese.
Deoarece MAP_32BIT reduce intervalul de adrese disponibil pentru generarea aleatorie a spațiului
de adrese (ASLR), LD_PREFER_MAP_32BIT_EXEC este întotdeauna dezactivat în modul de
execuție-securizată.
FIȘIERE
/lib/ld.so
editor de legături/încărcător dinamic a.out
/lib/ld-linux.so.{1,2}
editor de legături/încărcător dinamic ELF
/etc/ld.so.cache
Fișier care conține o listă compilată de directoare în care să se caute obiecte partajate și o
listă ordonată de obiecte partajate candidate. A se vedea ldconfig(8).
/etc/ld.so.preload
Fișier care conține o listă separată prin spații albe de obiecte partajate ELF care urmează să fie
încărcate înainte de program. A se vedea discuția de mai sus despre LD_PRELOAD. Dacă sunt
utilizate atât LD_PRELOAD, cât și /etc/ld.so.preload, bibliotecile specificate de LD_PRELOAD sunt
preîncărcate primele. /etc/ld.so.preload are un efect la nivelul întregului sistem, făcând ca
bibliotecile specificate să fie preîncărcate pentru toate programele care sunt executate pe
sistem; (acest lucru este de obicei nedorit și este utilizat de obicei numai ca remediu de
urgență, de exemplu, ca o soluție temporară la o problemă de configurare greșită a bibliotecilor).
Translated with DeepL.com (free version)
lib*.so*
Obiecte partajate
NOTE
Capacități Hardware vechi (de la glibc 2.5 la glibc 2.37)
Unele obiecte partajate sunt compilate folosind instrucțiuni specifice hardware care nu există pe fiecare
CPU. Astfel de obiecte trebuie instalate în directoare ale căror nume definesc capacitățile hardware
necesare, cum ar fi /usr/lib/sse2/. Editorul de legături dinamice verifică aceste directoare în funcție
de hardware-ul mașinii și selectează cea mai adecvată versiune a unui anumit obiect partajat.
Directoarele de capacități hardware pot fi puse în cascadă pentru a combina caracteristicile CPU. Lista
de nume de capacități hardware acceptate depinde de CPU. În prezent, sunt recunoscute următoarele nume:
Alpha ev4, ev5, ev56, ev6, ev67
MIPS loongson2e, loongson2f, octeon, octeon2
PowerPC
4xxmac, altivec, arch_2_05, arch_2_06, booke, cellbe, dfp, efpdouble, efpsingle, fpu, ic_snoop,
mmu, notb, pa6t, power4, power5, power5+, power6x, ppc32, ppc601, ppc64, smt, spe, ucache, vsx
SPARC flush, muldiv, stbar, swap, ultra3, v9, v9v, v9v2
s390 dfp, eimm, esan3, etf3enh, g5, highgprs, hpage, ldisp, msa, stfle, z900, z990, z9-109, z10, zarch
x86 (doar 32-biți)
acpi, apic, clflush, cmov, cx8, dts, fxsr, ht, i386, i486, i586, i686, mca, mmx, mtrr, pat, pbe,
pge, pn, pse36, sep, ss, sse, sse2, tm
Suportul capacităților hardware vechi are dezavantajul că fiecare caracteristică nouă adăugată mărește
exponențial ruta de căutare, deoarece trebuie să fie adăugată la fiecare combinație a celorlalte
caracteristici existente.
De exemplu, pe x86 pe 32 de biți, dacă hardware-ul acceptă i686 și sse2, ruta de căutare rezultată va fi
i686/sse2:i686:sse2:.. O nouă capacitate newcap va defini ruta de căutare la
newcap/i686/sse2:newcap/i686:newcap/sse2:newcap:i686/sse2:i686:sse2:.
Capacități hardware glibc (de la glibc 2.33)
glibc 2.33 a adăugat o nouă schemă de capacități hardware,
în care, în cadrul fiecărei arhitecturi de procesor, pot fi definite anumite niveluri, care
grupează suportul pentru anumite caracteristici sau instrucțiuni speciale. Fiecare nivel de
arhitectură are un set fix de rute pe care le adaugă la lista de căutare a editorului de legături
dinamice, în funcție de hardware-ul mașinii. Deoarece fiecare nou nivel de arhitectură nu este
combinat cu cele existente anterior, noua schemă nu are dezavantajul creșterii necontrolate a
listei de căutare a editorului de legături dinamice.
De exemplu, pe x86 pe 64 de biți, dacă hardware-ul acceptă x86_64-v3 (de exemplu Intel Haswell sau AMD
Excavator), ruta de căutare rezultată va fi glibc-hwcaps/x86-64-v3:glibc-hwcaps/x86-64-v2:. Următoarele
rute sunt acceptate în prezent, în ordinea priorităților.
PowerPC (numai little-endian pe 64 de biți)
power10, power9
s390 (doar 64-bți)
z16, z15, z14, z13
x86 (doar 64-biți)
x86-64-v4, x86-64-v3, x86-64-v2
glibc 2.37 a eliminat suportul pentru capacitățile hardware moștenite(învechite).
CONSULTAȚI ȘI
ld(1), ldd(1), pldd(1), sprof(1), dlopen(3), getauxval(3), elf(5), capabilities(7), rtld-audit(7),
ldconfig(8), sln(8)
TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu
<remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o
versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO
RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-
ro@lists.sourceforge.net.
Pagini de manual de Linux 6.9.1 8 mai 2024 ld.so(8)