Zoeken op website

Gedeelde bibliotheken in Linux begrijpen


Bij het programmeren is een bibliotheek een verzameling vooraf gecompileerde stukjes code die in een programma kunnen worden hergebruikt. Bibliotheken vereenvoudigen het leven van programmeurs, doordat ze herbruikbare functies, routines, klassen, datastructuren, enzovoort (geschreven door een andere programmeur) bieden, die ze in hun programma's kunnen gebruiken.

Als u bijvoorbeeld een applicatie bouwt die wiskundige bewerkingen moet uitvoeren, hoeft u daarvoor geen nieuwe wiskundige functie te maken; u kunt eenvoudigweg bestaande functies in bibliotheken voor die programmeertaal gebruiken.

Voorbeelden van bibliotheken in Linux zijn libc (de standaard C-bibliotheek) of Glibc (GNU-versie van de standaard C-bibliotheek), libcurl (multiprotocolbestand transferbibliotheek), libcrypt (bibliotheek gebruikt voor codering, hashing en codering in C), en nog veel meer.

Linux ondersteunt twee klassen bibliotheken, namelijk:

  • Statische bibliotheken – worden tijdens het compileren statisch aan een programma gebonden.
  • Dynamische of gedeelde bibliotheken – worden geladen wanneer een programma wordt gestart en in het geheugen geladen en binding vindt plaats tijdens runtime.

Dynamische of gedeelde bibliotheken kunnen verder worden onderverdeeld in:

  • Dynamisch gekoppelde bibliotheken – hier is een programma gekoppeld aan de gedeelde bibliotheek en de kernel laadt de bibliotheek (voor het geval deze zich niet in het geheugen bevindt) tijdens de uitvoering.
  • Dynamisch geladen bibliotheken – het programma neemt de volledige controle over door functies aan te roepen met de bibliotheek.

Naamgevingsconventies voor gedeelde bibliotheken

Gedeelde bibliotheken worden op twee manieren benoemd: de bibliotheeknaam (ook wel soname genoemd) en een “bestandsnaam” (absoluut pad naar bestand waarin de bibliotheekcode is opgeslagen).

De soname voor libc is bijvoorbeeld libc.so.6: waarbij lib het voorvoegsel is, c is een beschrijvende naam, dus betekent gedeeld object, en 6 is de versie. En de bestandsnaam is: /lib64/libc.so.6. Merk op dat de soname eigenlijk een symbolische link naar de bestandsnaam is.

Gedeelde bibliotheken zoeken in Linux

Gedeelde bibliotheken worden geladen door ld.so (of ld.so.x) en ld-linux.so (of ld- linux.so.x) programma's, waarbij x de versie is. In Linux zoekt en laadt /lib/ld-linux.so.x alle gedeelde bibliotheken die door een programma worden gebruikt.

Een programma kan een bibliotheek oproepen met behulp van de bibliotheeknaam of bestandsnaam, en in een bibliotheekpad worden mappen opgeslagen waarin bibliotheken in het bestandssysteem kunnen worden gevonden. Standaard bevinden bibliotheken zich in /usr/local/lib, /usr/local/lib64, /usr/lib en /usr/lib64; systeemopstartbibliotheken bevinden zich in /lib en /lib64. Programmeurs kunnen bibliotheken echter op aangepaste locaties installeren.

Het bibliotheekpad kan worden gedefinieerd in het bestand /etc/ld.so.conf dat u kunt bewerken met een opdrachtregeleditor.

vi /etc/ld.so.conf 

De regel(s) in dit bestand instrueren de kernel om het bestand te laden in /etc/ld.so.conf.d. Op deze manier kunnen pakketbeheerders of programmeurs hun aangepaste bibliotheekmappen aan de zoeklijst toevoegen.

Als je in de map /etc/ld.so.conf.d kijkt, zul je .conf-bestanden zien voor enkele veelgebruikte pakketten (kernel, mysql en postgresql in deze zaak):

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

Als u mariadb-x86_64.conf bekijkt, ziet u een absoluut pad naar pakketbibliotheken.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Met de bovenstaande methode wordt het bibliotheekpad permanent ingesteld. Om dit tijdelijk in te stellen, gebruikt u de omgevingsvariabele LD_LIBRARY_PATH op de opdrachtregel. Als je de wijzigingen permanent wilt behouden, voeg dan deze regel toe aan het shell-initialisatiebestand /etc/profile (algemeen) of ~/.profile (gebruikersspecifiek).

export LD_LIBRARY_PATH=/path/to/library/file

Gedeelde bibliotheken beheren in Linux

Laten we nu eens kijken hoe we met gedeelde bibliotheken moeten omgaan. Om een lijst te krijgen van alle gedeelde bibliotheekafhankelijkheden voor een binair bestand, kunt u het ldd-hulpprogramma gebruiken. De uitvoer van ldd heeft de vorm:

library name =>  filename (some hexadecimal value)
OR
filename (some hexadecimal value)  #this is shown when library name can’t be read

Met deze opdracht worden alle gedeelde bibliotheekafhankelijkheden voor de ls-opdracht weergegeven.

ldd /usr/bin/ls
OR
ldd /bin/ls
Voorbeelduitvoer
	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)

Omdat gedeelde bibliotheken in veel verschillende mappen kunnen voorkomen, zou het doorzoeken van al deze mappen wanneer een programma wordt gestart zeer inefficiënt zijn: wat een van de waarschijnlijke nadelen van dynamische bibliotheken is. Daarom wordt er gebruik gemaakt van een caching-mechanisme, uitgevoerd door het programma ldconfig.

Standaard leest ldconfig de inhoud van /etc/ld.so.conf, creëert de juiste symbolische links in de dynamische linkmappen en schrijft vervolgens een cache naar /etc/ld.so.cache die vervolgens gemakkelijk door andere programma's kan worden gebruikt.

Dit is erg belangrijk, vooral als u zojuist nieuwe gedeelde bibliotheken heeft geïnstalleerd of uw eigen bibliotheekmappen heeft gemaakt. U moet de opdracht ldconfig uitvoeren om de wijzigingen door te voeren.

ldconfig
OR
ldconfig -v 	#shows files and directories it works with

Nadat u uw gedeelde bibliotheek heeft aangemaakt, moet u deze installeren. U kunt het naar een van de bovengenoemde standaardmappen verplaatsen en de opdracht ldconfig uitvoeren.

U kunt ook de volgende opdracht uitvoeren om symbolische koppelingen van de soname naar de bestandsnaam te maken:

ldconfig -n /path/to/your/shared/libraries

Om aan de slag te gaan met het maken van uw eigen bibliotheken, kunt u deze handleiding van The Linux Documentation Project (TLDP) raadplegen.

Dat is het voor nu! In dit artikel hebben we u een inleiding tot bibliotheken gegeven en gedeelde bibliotheken uitgelegd, en hoe u deze in Linux kunt beheren. Als u vragen of aanvullende ideeën heeft om te delen, gebruikt u het onderstaande opmerkingenformulier.