Forstå delte biblioteker i Linux


I programmering er et bibliotek et utvalg av forhåndskompilerte kodebiter som kan gjenbrukes i et program. Biblioteker forenkler livet for programmerere, ved at de gir gjenbrukbare funksjoner, rutiner, klasser, datastrukturer og så videre (skrevet av en annen programmerer), som de kan bruke i programmene sine.

For eksempel, hvis du bygger en applikasjon som trenger å utføre matematiske operasjoner, trenger du ikke å lage en ny matematikkfunksjon for det, du kan ganske enkelt bruke eksisterende funksjoner i biblioteker for det programmeringsspråket.

Eksempler på biblioteker i Linux inkluderer libc (standard C-biblioteket) eller Glibc (GNU-versjon av standard C-biblioteket), libcurl (multiprotokollfil overføringsbibliotek), libcrypt (bibliotek som brukes til kryptering, hashing og koding i C), og mange flere.

Linux støtter to klasser av biblioteker, nemlig:

  • Statiske biblioteker – er bundet til et program statisk ved kompilering.
  • Dynamiske eller delte biblioteker – lastes inn når et program startes og lastes inn i minnet og binding skjer under kjøring.

Dynamiske eller delte biblioteker kan videre kategoriseres i:

  • Dynamisk koblede biblioteker – her er et program koblet til det delte biblioteket og kjernen laster biblioteket (i tilfelle det ikke er i minnet) ved kjøring.
  • Dynamisk lastede biblioteker – programmet tar full kontroll ved å kalle opp funksjoner med biblioteket.

Navnekonvensjoner for delt bibliotek

Delte biblioteker navngis på to måter: biblioteknavnet (a.k.a soname) og et "filnavn" (absolutt bane til fil som lagrer bibliotekskode).

For eksempel er soname for libc libc.so.6: der lib er prefikset, >c er et beskrivende navn, så betyr delt objekt, og 6 er versjonen. Og filnavnet er: /lib64/libc.so.6. Merk at sonavnet faktisk er en symbolsk lenke til filnavnet.

Finne delte biblioteker i Linux

Delte biblioteker lastes inn av ld.so (eller ld.so.x) og ld-linux.so (eller ld- linux.so.x) programmer, der x er versjonen. I Linux søker og laster /lib/ld-linux.so.x alle delte biblioteker som brukes av et program.

Et program kan kalle et bibliotek ved å bruke biblioteksnavnet eller filnavnet, og en biblioteksti lagrer kataloger der bibliotekene kan finnes i filsystemet. Som standard er biblioteker plassert i /usr/local/lib, /usr/local/lib64, /usr/lib og /usr/lib64; systemoppstartsbiblioteker er i /lib og /lib64. Programmerere kan imidlertid installere biblioteker på egendefinerte steder.

Bibliotekbanen kan defineres i filen /etc/ld.so.conf som du kan redigere med et kommandolinjeredigeringsprogram.

vi /etc/ld.so.conf 

Linjen(e) i denne filen instruerer kjernen om å laste filen i /etc/ld.so.conf.d. På denne måten kan pakkevedlikeholdere eller programmerere legge til sine egendefinerte bibliotekkataloger i søkelisten.

Hvis du ser inn i katalogen /etc/ld.so.conf.d, vil du se .conf-filer for noen vanlige pakker (kjerne, mysql og postgresql i denne saken):

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 tar en titt på mariadb-x86_64.conf, vil du se en absolutt bane til pakkebiblioteker.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Metoden ovenfor setter bibliotekbanen permanent. For å angi det midlertidig, bruk LD_LIBRARY_PATH miljøvariabelen på kommandolinjen. Hvis du vil beholde endringene permanent, legger du til denne linjen i initialiseringsfilen /etc/profile (global) eller ~/.profile (brukerspesifikk).

export LD_LIBRARY_PATH=/path/to/library/file

Administrere delte biblioteker i Linux

La oss nå se på hvordan vi skal håndtere delte biblioteker. For å få en liste over alle delte biblioteksavhengigheter for en binær fil, kan du bruke ldd-verktøyet. Utdataene til ldd er i formen:

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

Denne kommandoen viser alle delte biblioteksavhengigheter for ls-kommandoen.

ldd /usr/bin/ls
OR
ldd /bin/ls
Eksempelutgang
	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 forskjellige kataloger, vil det være svært ineffektivt å søke gjennom alle disse katalogene når et program startes: noe som er en av de sannsynlige ulempene med dynamiske biblioteker. Derfor brukes en mekanisme for caching, utført av programmet ldconfig.

Som standard leser ldconfig innholdet i /etc/ld.so.conf, oppretter de passende symbolske koblingene i katalogene for dynamiske koblinger, og skriver deretter en hurtigbuffer til /etc/ld.so.cache som da lett kan brukes av andre programmer.

Dette er veldig viktig, spesielt når du nettopp har installert nye delte biblioteker eller opprettet dine egne, eller opprettet nye bibliotekkataloger. Du må kjøre kommandoen ldconfig for å utføre endringene.

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

Etter å ha opprettet det delte biblioteket ditt, må du installere det. Du kan enten flytte den inn i en av standardkatalogene nevnt ovenfor og kjøre ldconfig-kommandoen.

Alternativt kan du kjøre følgende kommando for å lage symbolske lenker fra soname til filnavnet:

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

For å komme i gang med å lage dine egne biblioteker, sjekk ut denne veiledningen fra The Linux Documentation Project (TLDP).

Det er alt for nå! I denne artikkelen ga vi deg en introduksjon til biblioteker og forklarte delte biblioteker, og hvordan du administrerer dem i Linux. Hvis du har spørsmål eller flere ideer å dele, bruk kommentarskjemaet nedenfor.