Forståelse af delte biblioteker i Linux


Ved programmering er et bibliotek et udvalg af præ-kompilerede kodestykker, der kan genbruges i et program. Biblioteker forenkler programmørernes liv, idet de leverer genanvendelige funktioner, rutiner, klasser, datastrukturer og så videre (skrevet af en anden programmør), som de kan bruge i deres programmer.

For eksempel, hvis du bygger et program, der skal udføre matematiske operationer, behøver du ikke oprette en ny matematikfunktion til det, du kan simpelthen bruge eksisterende funktioner i biblioteker til det programmeringssprog.

Eksempler på biblioteker i Linux inkluderer libc (standard C-biblioteket) eller glibc (GNU-version af standard C-biblioteket), libcurl (multiprotocol-filoverførselsbibliotek), libcrypt (bibliotek brugt til kryptering, hashing og kodning i C) og mange flere .

Linux understøtter to klasser af biblioteker, nemlig:

  • Statiske biblioteker - er bundet til et program statisk på kompileringstidspunktet.
  • Dynamiske eller delte biblioteker - indlæses, når et program startes og indlæses i hukommelsen, og der opstår binding på kørselstidspunktet.

Dynamiske eller delte biblioteker kan yderligere kategoriseres i:

  • Dynamisk linkede biblioteker - her er et program linket til det delte bibliotek, og kernen indlæser biblioteket (hvis det ikke er i hukommelsen) ved udførelse.
  • Dynamisk indlæste biblioteker - programmet tager fuld kontrol ved at ringe til funktioner med biblioteket.

Delte biblioteker er navngivet på to måder: biblioteksnavnet (aka soname) og et "filnavn" (absolut sti til fil, der gemmer bibliotekets kode).

For eksempel er soname for libc libc.so.6: hvor lib er præfikset, c er et beskrivende navn, så det betyder delt objekt, og 6 er versionen. Og dets filnavn er: /lib64/libc.so.6. Bemærk, at soname faktisk er et symbolsk link til filnavnet.

Delte biblioteker indlæses af programmer ld.so (eller ld.so.x) og ld-linux.so (eller ld-linux.so.x), hvor x er versionen. I Linux søger /lib/ld-linux.so.x og indlæser alle delte biblioteker, der bruges af et program.

Et program kan kalde et bibliotek ved hjælp af dets biblioteksnavn eller filnavn, og en bibliotekssti gemmer mapper, hvor biblioteker kan findes i filsystemet. Som standard er bibliotekerne placeret i/usr/local/lib,/usr/local/lib64,/usr/lib og/usr/lib64; systemstartbiblioteker er i/lib og/lib64. Programmører kan dog installere biblioteker på brugerdefinerede placeringer.

Biblioteksstien kan defineres i /etc/ld.so.conf-filen, som du kan redigere med en kommandolinjeditor.

# vi /etc/ld.so.conf 

Linjen (e) i denne fil instruerer kernen i at indlæse filen i /etc/ld.so.conf.d. På denne måde kan pakkeholdere eller programmører tilføje deres brugerdefinerede biblioteksmapper til søgelisten.

Hvis du kigger ind i /etc/ld.so.conf.d-biblioteket, kan du se .conf-filer for nogle almindelige pakker (i dette tilfælde kerne, mysql og postgresql):

# 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

Hvis du kigger på mariadb-x86_64.conf, vil du se en absolut sti til pakkens biblioteker.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

Metoden ovenfor indstiller biblioteksstien permanent. For at indstille det midlertidigt skal du bruge miljøvariablen LD_LIBRARY_PATH på kommandolinjen. Hvis du vil holde ændringerne permanente, skal du tilføje denne linje i shell-initialiseringsfilen/etc/profile (global) eller ~/.profile (brugerspecifik).

# export LD_LIBRARY_PATH=/path/to/library/file

Lad os nu se på, hvordan vi skal håndtere delte biblioteker. For at få en liste over alle delte biblioteksafhængigheder for en binær fil kan du bruge ldd-værktøjet. Outputtet af ldd er i form:

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

Denne kommando viser alle delte biblioteksafhængigheder for ls-kommandoen.

# 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)

Fordi delte biblioteker kan eksistere i mange forskellige biblioteker, ville det være meget ineffektivt at søge i alle disse biblioteker, når et program startes, hvilket er en af de sandsynlige ulemper ved dynamiske biblioteker. Derfor anvendes en cachemekanisme, der udføres af programmet ldconfig.

Som standard læser ldconfig indholdet af /etc/ld.so.conf, opretter de relevante symbolske links i de dynamiske linkmapper og skriver derefter en cache til /etc/ld.so.cache, som derefter let bruges af andre programmer .

Dette er meget vigtigt, især når du lige har installeret nye delte biblioteker eller oprettet dine egne eller oprettet nye biblioteksmapper. Du skal køre kommandoen ldconfig for at gennemføre ændringerne.

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

Når du har oprettet dit delte bibliotek, skal du installere det. Du kan enten flytte den til et af de ovennævnte standardkataloger og køre kommandoen ldconfig.

Alternativt kan du køre følgende kommando for at oprette symbolske links fra soname til filnavn:

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

For at komme i gang med at oprette dine egne biblioteker skal du tjekke denne vejledning fra Linux Documentation Project (TLDP).

Det er alt for nu! I denne artikel gav vi dig en introduktion til biblioteker, forklarede delte biblioteker og hvordan du administrerer dem i Linux. Hvis du har spørgsmål eller yderligere ideer at dele, skal du bruge kommentarformularen nedenfor.