Jaettujen kirjastojen ymmärtäminen Linuxissa


Ohjelmoinnissa kirjasto on valikoima esikäännettyjä koodinpätkiä, joita voidaan käyttää uudelleen ohjelmassa. Kirjastot yksinkertaistavat ohjelmoijien elämää siten, että ne tarjoavat uudelleenkäytettäviä toimintoja, rutiineja, luokkia, tietorakenteita ja niin edelleen (toisen ohjelmoijan kirjoittamia), joita he voivat käyttää ohjelmissaan.

Jos esimerkiksi rakennat sovellusta, joka tarvitsee matemaattisia operaatioita, sinun ei tarvitse luoda sitä varten uutta matemaattista funktiota, voit yksinkertaisesti käyttää olemassa olevia funktioita kirjastoissa kyseiselle ohjelmointikielelle.

Esimerkkejä Linuxin kirjastoista ovat libc (tavallinen C-kirjasto) tai Glibc (standardin C-kirjaston GNU-versio), libcurl (moniprotokollatiedosto siirtokirjasto), libcrypt (kirjasto, jota käytetään C:n salaukseen, tiivistykseen ja koodaukseen) ja monia muita.

Linux tukee kahta kirjastoluokkaa, nimittäin:

  • Staattiset kirjastot – ne on sidottu ohjelmaan staattisesti käännöshetkellä.
  • Dynaamiset tai jaetut kirjastot – ladataan, kun ohjelma käynnistetään ja ladataan muistiin, ja sidonta tapahtuu suorituksen aikana.

Dynaamiset tai jaetut kirjastot voidaan edelleen luokitella:

  • Dynaamisesti linkitetyt kirjastot – tässä ohjelma linkitetään jaettuun kirjastoon ja ydin lataa kirjaston (jos se ei ole muistissa) suorituksen yhteydessä.
  • Dynaamisesti ladatut kirjastot – ohjelma ottaa täyden hallinnan kutsumalla toimintoja kirjaston kanssa.

Yhteiset kirjastojen nimeämiskäytännöt

Jaetut kirjastot nimetään kahdella tavalla: kirjaston nimi (eli soname) ja "tiedostonimi" (absoluuttinen polku tiedostoon, joka tallentaa kirjastokoodin).

Esimerkiksi libc:n soname on libc.so.6: missä lib on etuliite, >c on kuvaava nimi, joten se tarkoittaa jaettua objektia, ja 6 on versio. Ja sen tiedostonimi on: /lib64/libc.so.6. Huomaa, että soname on itse asiassa symbolinen linkki tiedostonimeen.

Jaettujen kirjastojen paikantaminen Linuxissa

Jaetut kirjastot lataavat ld.so (tai ld.so.x) ja ld-linux.so (tai ld- linux.so.x) -ohjelmat, missä x on versio. Linuxissa /lib/ld-linux.so.x etsii ja lataa kaikki ohjelman käyttämät jaetut kirjastot.

Ohjelma voi kutsua kirjastoa käyttämällä kirjaston nimeä tai tiedostonimeä, ja kirjastopolku tallentaa hakemistoja, joista kirjastot löytyvät tiedostojärjestelmästä. Oletuksena kirjastot sijaitsevat hakemistoissa /usr/local/lib, /usr/local/lib64, /usr/lib ja /usr/lib64; järjestelmän käynnistyskirjastot ovat hakemistoissa /lib ja /lib64. Ohjelmoijat voivat kuitenkin asentaa kirjastoja mukautettuihin paikkoihin.

Kirjaston polku voidaan määrittää /etc/ld.so.conf-tiedostossa, jota voit muokata komentorivieditorilla.

vi /etc/ld.so.conf 

Tämän tiedoston rivi(t) ohjeistaa ydintä lataamaan tiedoston /etc/ld.so.conf.d. Tällä tavalla pakettien ylläpitäjät tai ohjelmoijat voivat lisätä mukautettuja kirjastohakemistojaan hakuluetteloon.

Jos katsot /etc/ld.so.conf.d-hakemistoa, näet .conf-tiedostoja joidenkin yleisten pakettien (ydin, mysql ja postgresql Tämä tapaus):

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

Jos katsot tiedostoa mariadb-x86_64.conf, näet ehdottoman polun pakettikirjastoihin.

cat mariadb-x86_64.conf

/usr/lib64/mysql

Yllä oleva menetelmä asettaa kirjastopolun pysyvästi. Voit määrittää sen väliaikaisesti käyttämällä komentorivin ympäristömuuttujaa LD_LIBRARY_PATH. Jos haluat pitää muutokset pysyvinä, lisää tämä rivi komentotulkin alustustiedostoon /etc/profile (global) tai ~/.profile (käyttäjäkohtainen).

export LD_LIBRARY_PATH=/path/to/library/file

Jaettujen kirjastojen hallinta Linuxissa

Katsotaanpa nyt, kuinka käsitellä jaettuja kirjastoja. Saat luettelon kaikista binaaritiedoston jaetun kirjaston riippuvuuksista käyttämällä ldd-apuohjelmaa. ldd-tuloste on seuraavassa muodossa:

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

Tämä komento näyttää kaikki ls-komennon jaetun kirjaston riippuvuudet.

ldd /usr/bin/ls
OR
ldd /bin/ls
Näytelähtö
	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)

Koska jaettuja kirjastoja voi olla monissa eri hakemistoissa, kaikkien näiden hakemistojen etsiminen ohjelman käynnistyksen yhteydessä olisi erittäin tehotonta: mikä on yksi dynaamisten kirjastojen todennäköisistä haitoista. Siksi käytetään välimuistimekanismia, jonka suorittaa ldconfig-ohjelma.

Oletuksena ldconfig lukee tiedoston /etc/ld.so.conf sisällön, luo sopivat symboliset linkit dynaamisiin linkkihakemistoihin ja kirjoittaa sitten välimuistin >/etc/ld.so.cache, jota muut ohjelmat voivat sitten helposti käyttää.

Tämä on erittäin tärkeää varsinkin, kun olet juuri asentanut uusia jaettuja kirjastoja tai luonut omia tai luonut uusia kirjastohakemistoja. Sinun on suoritettava ldconfig-komento tehdäksesi muutokset.

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

Kun olet luonut jaetun kirjaston, sinun on asennettava se. Voit joko siirtää sen mihin tahansa yllä mainituista vakiohakemistoista ja suorittaa komennon ldconfig.

Vaihtoehtoisesti voit luoda symbolisia linkkejä sonamesta tiedostonimeen suorittamalla seuraavan komennon:

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

Aloita omien kirjastojen luominen tutustumalla tähän The Linux Documentation Projectin (TLDP) oppaaseen.

Tässä kaikki tältä erää! Tässä artikkelissa esitimme sinulle kirjastot ja selitimme jaetut kirjastot sekä niiden hallinnan Linuxissa. Jos sinulla on kysyttävää tai muita ideoita jaettavana, käytä alla olevaa kommenttilomaketta.