Linuxin perusteet: staattiset kirjastot vs. dynaamiset kirjastot

Erika Caoili

Follow

joulu 17, 2019 * 4 min lukea

Kuva: Edwin Andrade on Unsplash

mikä on kirjasto Linuxissa?

miksi käytämme kirjastoja?

Miten luodaan staattinen ja dynaaminen kirjasto?

miten ja miksi niitä käytetään?

kirjasto Linuxissa

kirjasto on kokoelma valmiiksi koottuja koodinpätkiä, joita kutsutaan funktioiksi. Kirjasto sisältää yhteisiä toimintoja ja yhdessä ne muodostavat paketin nimeltä — kirjasto. Funktiot ovat koodilohkoja, joita käytetään uudelleen koko ohjelman ajan. Koodin palasten käyttäminen uudelleen ohjelmassa säästää aikaa. Se estää ohjelmoijaa kirjoittamasta koodia uudelleen useita kertoja. Ohjelmoijille kirjastot tarjoavat uudelleenkäytettäviä toimintoja, tietorakenteita, luokkia ja niin edelleen.

”jos esimerkiksi rakennat sovellusta, jonka täytyy suorittaa matematiikkatoimintoja, sinun ei tarvitse luoda uutta matematiikkafunktiota sitä varten, voit yksinkertaisesti käyttää olemassa olevia toimintoja kirjastoissa kyseiselle ohjelmointikielelle.”(”Jaettujen kirjastojen ymmärtäminen Linuxissa”)

kirjasto ei ole suoritettavaa ja se on keskeinen ero prosesseihin ja sovelluksiin. Kirjastot toimivat suoritus – tai käännösaikaan. C-ohjelmointikielessä on kahdenlaisia kirjastoja: dynaamisia kirjastoja ja staattisia kirjastoja.

kirjastoissa on "-c" gcc flag : n luomia objektitiedostoja, jotka päättyvät ".o": n kautta. Ne ovat kääntäjän ulostulon tulos ja sisältävät funktion määritelmät binäärimuodossa.

dynaamisten ja staattisten kirjastojen väliset erot

dynaamisilla kirjastoilla on”*. joten ”nimeämiskäytäntö ja staattisilla kirjastoilla on”*.a”.

dynaamiset tai jaetut kirjastot esiintyvät erillisinä tiedostoina suoritettavien tiedostojen ulkopuolella. Näin ollen se tarvitsee vain yhden kopion kirjaston tiedostoista suorituksen aikana. Käännösaikaan staattiset kirjastot pysyvät lukittuina ohjelmaan. Se sisältää tiedoston ohjelmat, joilla on kopio kirjaston tiedostoista käännösaikaan.

käytettäessä dynaamista kirjastoa ohjelmoija viittaa kyseiseen kirjastoon, kun se on tarpeen suorituksen aikana. Esimerkiksi standard input/output header file – merkkijonon pituusfunktiota voi käyttää dynaamisesti. Se löytää ohjelman kirjaston viite ajonaikana, koska dynaaminen lataaja. Sitten se lataa, että merkkijonon pituus toiminto muistiin. Dynaamisen kirjaston saavutettavuuden on siis oltava helposti saatavilla tai se tulee voimattomaksi.

dynaamisten kirjastojen edut ja haitat

  1. se tarvitsee vain yhden kopion suoritettaessa. Se riippuu siitä, että sovellus ja kirjasto ovat tiiviisti toistensa käytettävissä.
  2. useat käynnissä olevat sovellukset käyttävät samaa kirjastoa ilman, että jokaisella tiedostolla on oma kopio.
  3. entä jos dynaaminen kirjasto korruptoituu? Suoritettava tiedosto ei välttämättä toimi, koska se elää suoritettavan tiedoston ulkopuolella ja on altis murtumiselle.
  4. heillä on hallussaan pienempiä kansioita.
  5. dynaamiset kirjastot linkittyvät toisiinsa suorituksen aikana. Se ei vaadi uudelleenkompilointia ja uudelleensinkitystä, kun ohjelmoija tekee muutoksen.

käännösaikaan sovellukset hyödyntävät staattisia kirjastoja. Kaikki kopiot toiminnot saada sijoitettu hakemustiedostoon, koska niitä tarvitaan prosessin suorittamiseen.

staattisten kirjastojen edut ja haitat

  1. staattiset kirjastot vastustavat haavoittuvuutta, koska se elää suoritettavan tiedoston sisällä.
  2. ajonopeus tapahtuu nopeammin, koska sen kohdekoodi (binääri) on suoritettavassa tiedostossa. Näin ollen toimintoihin soitetut puhelut saadaan toteutettua nopeammin. Muista, että dynaaminen kirjasto elää suoritettavan ulkopuolella, joten puhelut soitettaisiin suoritettavan ulkopuolelta.
  3. tiedostoihin ja ohjelmaan tehdyt muutokset vaativat uudelleensinkitystä ja uudelleenkompilointia.
  4. tiedostokoko on paljon suurempi.

Miten luodaan staattinen ja dynaaminen kirjasto?

molempien kirjastojen osalta ohjelman tulee sisältää prototype jokaiselle kirjastossa olevalle funktiolle. Jos käytät otsikkotiedostoa, älä unohda sisällyttää header filename.

#include "<header file name>"

dynaamiset kirjastot

dynaamisen kirjaston luomiseksi kirjoita seuraava komento:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

"*.c" – merkillä se vie kaikki nykyisen hakemiston C-lähdekooditiedostot ja tekee jaetun kirjaston "liball.so." -fPIC – lipulla voidaan viitata seuraavaan koodiin missä tahansa virtuaaliosoitteessa suorituksen aikana. Se tulee sanoista Position Independent Code.Kirjasto ei säilytä tietoja kiinteissä osoitteissa, koska sen sijainti muistissa muuttuu ohjelmien välillä. Oliotiedostot kootaan käyttämällä -shared flag. compiler tunnistaa myöhemmin kirjaston etsimällä tiedostoja, jotka alkavat kirjaimella "lib" ja päättyvät nimeämiskäytäntöön, .so

ohjelma tarvitsee polun etsiäkseen kirjastotiedostoja. Niin, sinun täytyy kirjoittaa seuraava komento lisätä että sijainti ympäristömuuttuja nimeltään LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

kun käytät dynaamista kirjastoa, kirjoita seuraava komento:

gcc -g -wall -o app app.c liball.so

staattiset kirjastot

staattisen kirjaston luomiseksi on käytettävä seuraavaa komentoa:

ar rc liball.a dog.o cat.o bird.o

"ar" tarkoittaa archive ja sitä käytetään staattisen kirjaston luomiseen. Kaikki ".o" päättyvät tiedostot lisätään liball.a library: iin ja ne ovat tässä tapauksessa objektitiedostoja.

-rc flag tekee kaksi asiaa: korvaa ja luo uuden kirjaston, jos sitä ei ole jo olemassa. Seuraava askel on indeksointi, tehdä se, me Kirjoita:

ranlib liball.a

kun käytät staattista kirjastoa, kirjoita seuraava komento:

gcc main.c -L -l<filename>

-L flag käyttää linker, joten kirjastot löytyvät annetusta hakemistosta. Lisäksi se etsii myös muita paikkoja, joista kääntäjä etsii järjestelmäkirjastoja.

Vastaa

Sähköpostiosoitettasi ei julkaista.