dlsym(3) Library Functions Manual dlsym(3)

dlsym, dlvsym - obține adresa unui simbol dintr-un obiect partajat sau executabil

Bibliotecă de legături dinamice (libdl, -ldl)

#include <dlfcn.h>
void *dlsym(void *restrict handle, const char *restrict symbol);
#define _GNU_SOURCE
#include <dlfcn.h>
void *dlvsym(void *restrict handle, const char *restrict symbol,
             const char *restrict version);

Funcția dlsym() primește un gestionar, „handle” al unui obiect partajat încărcat dinamic returnat de dlopen(3) împreună cu un nume de simbol cu terminație nulă și returnează adresa la care simbolul respectiv este încărcat în memorie. În cazul în care simbolul nu este găsit în obiectul specificat sau în oricare dintre obiectele partajate care au fost încărcate automat de dlopen(3) la încărcarea obiectului respectiv, dlsym() returnează NULL; (căutarea efectuată de dlsym() se face în primul rând pe lățime prin arborele de dependență al acestor obiecte partajate).

În cazuri neobișnuite (a se vedea NOTE), valoarea simbolului poate fi de fapt NULL. Prin urmare, o returnare NULL de la dlsym() nu trebuie neapărat să indice o eroare. Modul corect de a distinge o eroare de un simbol a cărui valoare este NULL este să se apeleze dlerror(3) pentru a șterge orice condiții de eroare vechi, apoi să se apeleze dlsym() și apoi să se apeleze din nou dlerror(3), salvând valoarea de întoarcere a acestuia într-o variabilă și să se verifice dacă această valoare salvată nu este NULL.

Există doi pseudo-gestionari speciali care pot fi specificați în handle:

Găsește prima apariție a simbolului dorit utilizând ordinea implicită de căutare a obiectelor partajate. Căutarea va include simbolurile globale din executabil și din dependențele sale, precum și simbolurile din obiectele partajate care au fost încărcate dinamic cu fanionul RTLD_GLOBAL.
Găsește următoarea apariție a simbolului dorit în ordinea de căutare după obiectul curent. Acest lucru permite să se furnizeze o învăluire în jurul unei funcții dintr-un alt obiect partajat, astfel încât, de exemplu, definiția unei funcții dintr-un obiect partajat preîncărcat (a se vedea LD_PRELOAD în ld.so(8)) să poată găsi și invoca funcția „reală” furnizată într-un alt obiect partajat (sau, de asemenea, „următoarea” definiție a funcției în cazurile în care există mai multe niveluri de preîncărcare).

Macroul de testare a caracteristicii _GNU_SOURCE trebuie să fie definit pentru a obține definițiile RTLD_DEFAULT și RTLD_NEXT din <dlfcn.h>.

Funcția dlvsym() face același lucru ca dlsym(), dar primește un șir de versiuni ca argument suplimentar.

În caz de succes, aceste funcții returnează adresa asociată cu symbol. În caz de eșec, acestea returnează NULL; cauza erorii poate fi diagnosticată cu ajutorul dlerror(3).

Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).

Interfață Atribut Valoare
dlsym(), dlvsym() Siguranța firelor MT-Safe

POSIX.1-2008.
GNU.

glibc 2.0. POSIX.1-2001.
glibc 2.1.

Există mai multe scenarii în care adresa unui simbol global este NULL. De exemplu, un simbol poate fi plasat la adresa zero de către editorul de legături, prin intermediul unui script al editorului de legături sau cu ajutorul opțiunii din linia de comandă --defsym. Simbolurile slabe „weak” nedefinite au, de asemenea, valoarea NULL. În cele din urmă, valoarea simbolului poate fi rezultatul unei funcții de rezolvare a unei funcții indirecte GNU (IFUNC) care returnează NULL ca valoare rezolvată. În acest din urmă caz, dlsym() returnează, de asemenea, NULL fără eroare. Cu toate acestea, în primele două cazuri, comportamentul editorului de legături dinamice GNU este inconsecvent: procesarea realocării reușește și se poate observa că simbolul are valoarea NULL, dar dlsym() eșuează și dlerror() indică o eroare de căutare.

Funcția dlsym() face parte din API dlopen, derivată din SunOS. Acest sistem nu dispune de dlvsym().

A se vedea dlopen(3).

dl_iterate_phdr(3), dladdr(3), dlerror(3), dlinfo(3), dlopen(3), ld.so(8)

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.

2 mai 2024 Pagini de manual de Linux 6.8