Biblioteques compartides (shared libraries)
Introducció
En aquest article parlarem sobre biblioteques compartides, descrivint el que són, com identificar-les, on es troben i mostrarem com mostrar les biblioteques compartides de les que depèn un programa.
Què són les biblioteques compartides
Les llibreries compartides (shared libraries), o també objectes compartits (shared objects), són parts de codi compilat i reutilitzable, que els programes utilitzen de manera recurrent, és a dir, són trossos de codi que seran utilitzats per diferents programes.
Per entendre-ho millor, explicarem primer com es genera un arxiu executable a partir d’un codi font:
- El compilador converteix el codi font a codi màquina dins els object files.
- El linkador combina els object files i els vincula a les biblioteques.
Aquest enllaç del linkador es pot realitzar estàticament o dinàmicament, i segons el mètode parlarem de biblioteques estàtiques o dinàmiques.
Biblioteques estàtiques
Una còpia del codi de la biblioteca es fusiona amb el programa al moment de fer l’enllaç, és a dir, el tros de codi de la biblioteca requerit pel programa s’afegeix dins el programa.
Això fa que el programa no tingui dependències de biblioteques, tot i que també acaba creant un programa més pesat.
Biblioteques compartides (o dinàmiques)
El linker només s’encarrega que el programa faci referència a les biblioteques correctament, sense copiar-ne el codi.
Al contrari que amb les biblioteque estàtiques, en temps d’execució la biblioteca ha d’estar disponible.
D’aquesta manera, el programa ocupa menys i només es carrega una còpia de la biblioteca en memòria, encara que sigui utilitzada per diferents programes.
Nomenclatures i ubicacions
El nom d’una biblioteca compartida (soname, shared object name), segueix un patró format per tres elements:
- Nom de la biblioteca (normalment començant amb lib)
- so (shared object)
- Número de versió de la biblioteca
Exemple:
libpthread.so.0
Les llibreries estàtiques acaben en .a.
Exemple:
libpthread.a
glibc és un exemple de biblioteca compartida. En un sistema Debian GNU/Linux 9.9, l’arxiu es diu libc.so.6. Aquests noms d’arxiu solen ser enllaços simbòlics que apunten a la biblioteca.
Les ubicacions comunes per llibreries en sistemes Linux són:
-
/lib
-
/lib32
-
/lib64
-
/usr/lib
-
/usr/local/lib32
Configuració de rutes de biblioteques compartides
Les referències dins programes vinculats dinàmicament (biblioteques compartides), es resolen amb el linker dinàmic (ld.so o ld-linux.so) quan s’executa el programa. Aquest linker busca biblioteques a diferents directoris, especificats per la ruta de la biblioteca (que es configura a /etc/ld.so.conf i a arxius dins /etc/ld.so.conf.d).
La comanda ldconfig serveix per llegir els arxius de configuració i crear els enllaços simbòlics per localitzar les biblioteques individuals. A més, actualitza l’arxiu caché /etc/ld.so.cache. Aquesta comanda s’ha d’executar cada cop que es modifiquin o s’agreguin arxius de configuració.
Buscant les dependències d’un executable
Per buscar les dependències que té un executable, utilitzarem la comanda ldd seguit de la ruta absoluta del programa. Aquesta comanda mostrarà la ruta de la biblioteca compartida i la direcció de memòria on es carrega:
$ ldd /usr/bin/git
linux-vdso.so.1 (0x00007876420ca000)
/usr/${LIB}/libgtk3-nocsd.so.0 => /usr/lib/libgtk3-nocsd.so.0 (0x00007876420bb000)
libpcre2-8.so.0 => /usr/lib/libpcre2-8.so.0 (0x0000787641b62000)
libz.so.1 => /usr/lib/libz.so.1 (0x000078764207b000)
libc.so.6 => /usr/lib/libc.so.6 (0x0000787641976000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007876420cc000)
Disposa del paràmetre -u (–unused) per imprimir dependències no utilitzades.
Fins aquí el post d’avui. Si t’ha estat d’utilitat, pots deixar un comentari o compartir-ho. Ens veiem al següent!