Entendre les biblioteques compartides a Linux
En programació, una biblioteca és un assortiment de peces de codi precompilades que es poden reutilitzar en un programa. Les biblioteques simplifiquen la vida dels programadors, ja que proporcionen funcions reutilitzables, rutines, classes, estructures de dades, etc. (escrites per un altre programador), que poden utilitzar en els seus programes.
Per exemple, si esteu creant una aplicació que ha de realitzar operacions matemàtiques, no heu de crear una funció matemàtica nova per a això, simplement podeu utilitzar les funcions existents a les biblioteques per a aquest llenguatge de programació.
Exemples de biblioteques a Linux inclouen libc (la biblioteca C estàndard) o Glibc (versió GNU de la biblioteca C estàndard), libcurl (biblioteca de transferència de fitxers multiprotocol), libcrypt (biblioteca utilitzada per a xifrat, hash i codificació en C) i moltes més.
Linux admet dues classes de biblioteques, a saber:
- Biblioteques estàtiques: estan vinculades a un programa de manera estàtica en temps de compilació.
- Biblioteques dinàmiques o compartides: es carreguen quan s'inicia un programa i es carrega a la memòria i l'enllaç es produeix en temps d'execució.
Les biblioteques dinàmiques o compartides es poden classificar en:
- Biblioteques enllaçades dinàmicament: aquí s'enllaça un programa amb la biblioteca compartida i el nucli carrega la biblioteca (en cas que no estigui a la memòria) quan s'executa.
- Biblioteques carregades dinàmicament: el programa pren el control total cridant funcions amb la biblioteca.
Les biblioteques compartides s'anomenen de dues maneres: el nom de la biblioteca (també conegut com a soname) i un \filename (camí absolut al fitxer que emmagatzema el codi de la biblioteca).
Per exemple, el soname de libc és libc.so.6: on lib és el prefix, c és un nom descriptiu, per tant significa objecte compartit, i 6 és la versió. I el seu nom de fitxer és: /lib64/libc.so.6. Tingueu en compte que el soname és en realitat un enllaç simbòlic al nom del fitxer.
Les biblioteques compartides les carreguen els programes ld.so (o ld.so.x) i ld-linux.so (o ld-linux.so.x), on x és la versió. A Linux, /lib/ld-linux.so.x cerca i carrega totes les biblioteques compartides utilitzades per un programa.
Un programa pot cridar una biblioteca utilitzant el seu nom de biblioteca o el seu nom de fitxer, i una ruta de biblioteca emmagatzema directoris on es poden trobar biblioteques al sistema de fitxers. Per defecte, les biblioteques es troben a /usr/local/lib, /usr/local/lib64, /usr/lib i /usr/lib64; Les biblioteques d'inici del sistema es troben a /lib i /lib64. Tanmateix, els programadors poden instal·lar biblioteques en ubicacions personalitzades.
El camí de la biblioteca es pot definir al fitxer /etc/ld.so.conf que podeu editar amb un editor de línia d'ordres.
# vi /etc/ld.so.conf
Les línies d'aquest fitxer indiquen al nucli que carregui el fitxer a /etc/ld.so.conf.d. D'aquesta manera, els mantenedors de paquets o programadors poden afegir els seus directoris de biblioteques personalitzades a la llista de cerca.
Si mireu el directori /etc/ld.so.conf.d, veureu fitxers .conf per a alguns paquets comuns (nucli, mysql i postgresql en aquest cas):
# ls /etc/ld.so.conf.d kernel-2.6.32-358.18.1.el6.x86_64.conf kernel-2.6.32-696.1.1.el6.x86_64.conf mariadb-x86_64.conf kernel-2.6.32-642.6.2.el6.x86_64.conf kernel-2.6.32-696.6.3.el6.x86_64.conf postgresql-pgdg-libs.conf
Si mireu el mariadb-x86_64.conf, veureu un camí absolut a les biblioteques de paquets.
# cat mariadb-x86_64.conf /usr/lib64/mysql
El mètode anterior estableix el camí de la biblioteca de manera permanent. Per configurar-lo temporalment, utilitzeu la variable d'entorn LD_LIBRARY_PATH a la línia d'ordres. Si voleu mantenir els canvis permanents, afegiu aquesta línia al fitxer d'inicialització de l'intèrpret d'ordres /etc/profile (global) o ~/.profile (específic de l'usuari).
# export LD_LIBRARY_PATH=/path/to/library/file
Vegem ara com tractar les biblioteques compartides. Per obtenir una llista de totes les dependències de biblioteques compartides per a un fitxer binari, podeu utilitzar la utilitat ldd. La sortida de ldd té la forma:
library name => filename (some hexadecimal value) OR filename (some hexadecimal value) #this is shown when library name can’t be read
Aquesta ordre mostra totes les dependències de la biblioteca compartida per a l'ordre ls.
# ldd /usr/bin/ls OR # ldd /bin/ls
linux-vdso.so.1 => (0x00007ffebf9c2000) libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003b71e00000) librt.so.1 => /lib64/librt.so.1 (0x0000003b71600000) libcap.so.2 => /lib64/libcap.so.2 (0x0000003b76a00000) libacl.so.1 => /lib64/libacl.so.1 (0x0000003b75e00000) libc.so.6 => /lib64/libc.so.6 (0x0000003b70600000) libdl.so.2 => /lib64/libdl.so.2 (0x0000003b70a00000) /lib64/ld-linux-x86-64.so.2 (0x0000561abfc09000) libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003b70e00000) libattr.so.1 => /lib64/libattr.so.1 (0x0000003b75600000)
Com que les biblioteques compartides poden existir en molts directoris diferents, cercar a través de tots aquests directoris quan s'inicia un programa seria molt ineficient: que és un dels desavantatges probables de les biblioteques dinàmiques. Per tant, s'utilitza un mecanisme de memòria cau, realitzat pel programa ldconfig.
De manera predeterminada, ldconfig llegeix el contingut de /etc/ld.so.conf, crea els enllaços simbòlics adequats als directoris d'enllaços dinàmics i, a continuació, escriu una memòria cau a /etc/ld.so.cache que després s'utilitza fàcilment per altres programes. .
Això és molt important sobretot quan acabeu d'instal·lar biblioteques compartides noves o crear les vostres pròpies, o crear nous directoris de biblioteques. Heu d'executar l'ordre ldconfig per efectuar els canvis.
# ldconfig OR # ldconfig -v #shows files and directories it works with
Després de crear la vostra biblioteca compartida, heu d'instal·lar-la. Podeu moure'l a qualsevol dels directoris estàndard esmentats anteriorment i executar l'ordre ldconfig.
Alternativament, executeu l'ordre següent per crear enllaços simbòlics des del nom del so fins al nom del fitxer:
# ldconfig -n /path/to/your/shared/libraries
Per començar a crear les vostres pròpies biblioteques, consulteu aquesta guia de The Linux Documentation Project (TLDP).
Això és tot per ara! En aquest article, us vam donar una introducció a les biblioteques i vam explicar les biblioteques compartides i com gestionar-les a Linux. Si teniu preguntes o idees addicionals per compartir, utilitzeu el formulari de comentaris a continuació.