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.