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ó.