Jaettujen kirjastojen ymmärtäminen Linuxissa


Ohjelmoinnissa kirjasto on valikoima valmiiksi koottuja koodikappaleita, joita voidaan käyttää uudelleen ohjelmassa. Kirjastot yksinkertaistavat ohjelmoijien elämää, koska 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, jonka on suoritettava matemaattisia toimintoja, sinun ei tarvitse luoda uutta matematiikkatoimintoa, vaan voit käyttää kirjastojen olemassa olevia toimintoja kyseiselle ohjelmointikielelle.

Esimerkkejä Linux-kirjastoista ovat libc (standardi C-kirjasto) tai glibc (standardin C-kirjaston GNU-versio), libcurl (moniprotokollisten tiedostojen siirtokirjasto), libcrypt (salaus, hajautus ja koodaus C: ssä) ja monet muut .

Linux tukee kahta kirjastoluokkaa, nimittäin:

  • Staattiset kirjastot - sidotaan ohjelmaan staattisesti kokoamishetkellä.
  • Dynaamiset tai jaetut kirjastot - ladataan, kun ohjelma käynnistetään ja ladataan muistiin ja sidonta tapahtuu ajon aikana.

Dynaamiset tai jaetut kirjastot voidaan edelleen luokitella:

  • Dynaamisesti linkitetyt kirjastot - tässä ohjelma linkitetään jaettuun kirjastoon ja ydin lataa kirjaston (ellei sitä ole muistissa) suorituksen yhteydessä.
  • Dynaamisesti ladatut kirjastot - ohjelma ottaa täyden hallinnan kutsumalla toiminnot kirjaston kanssa.

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

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

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

Ohjelma voi soittaa kirjastoon kirjaston nimellä tai tiedostonimellä, ja kirjastopolku tallentaa hakemistot, joissa kirjastoja löytyy tiedostojärjestelmästä. Oletuksena kirjastot sijaitsevat kansioissa/usr/local/lib,/usr/local/lib64,/usr/lib ja/usr/lib64; järjestelmän käynnistyskirjastot ovat/lib ja/lib64. Ohjelmoijat voivat kuitenkin asentaa kirjastoja mukautettuihin sijainteihin.

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

# vi /etc/ld.so.conf 

Tämän tiedoston rivit osoittavat ytimen lataamaan tiedoston hakemistoon /etc/ld.so.conf.d. Tällä tavalla paketin ylläpitäjät tai ohjelmoijat voivat lisätä mukautetut kirjastohakemistonsa hakulistaan.

Jos tarkastelet hakemistoa /etc/ld.so.conf.d, näet .conf-tiedostot joillekin yleisimmille paketeille (tässä tapauksessa ydin, mysql ja 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

Jos katsot mariadb-x86_64.conf-tiedostoa, näet absoluuttisen polun paketin kirjastoihin.

# cat mariadb-x86_64.conf

/usr/lib64/mysql

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

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

Katsotaan nyt, miten käsitellä jaettuja kirjastoja. Ldd-apuohjelman avulla voit saada luettelon kaikista binaaritiedoston jaetun kirjaston riippuvuuksista. Ldd: n lähtö on 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 jaetun kirjaston riippuvuudet komennolle ls.

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

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

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

Tämä on erittäin tärkeää erityisesti silloin, kun olet juuri asentanut uusia jaettuja kirjastoja tai luonut omia tai luonut uusia kirjastohakemistoja. Suorita muutokset suorittamalla komento ldconfig.

# 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ä mainittuun vakiohakemistoon ja suorittaa komennon ldconfig.

Vaihtoehtoisesti voit suorittaa seuraavan komennon luodaksesi symbolisia linkkejä sonamesta tiedostonimeen:

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

Aloita omien kirjastojen luominen tutustumalla tähän oppaaseen Linux-dokumentointiprojektista (TLDP).

Tässä kaikki tältä erää! Tässä artikkelissa annoimme sinulle johdannon kirjastoihin, selitimme jaettuja kirjastoja ja niiden hallintaa Linuxissa. Jos sinulla on kysyttävää tai muita ideoita jaettavaksi, käytä alla olevaa kommenttilomaketta.