Linux Basiskennis: Statische Bibliotheken vs. Dynamische Bibliotheken

Erika Caoili

Volg

Dec 17, 2019 · 4 min lezen

Foto door Edwin Andrade op Unsplash

Wat is een bibliotheek in Linux?

waarom gebruiken we bibliotheken?

Hoe maak ik een statische en dynamische bibliotheek?

hoe en waarom gebruiken we ze?

een bibliotheek in Linux

een bibliotheek is een verzameling van voorgecompileerde stukken code genaamd functies. De bibliotheek bevat gemeenschappelijke functies en samen vormen ze een pakket genaamd — een bibliotheek. Functies zijn blokken code die worden hergebruikt in het hele programma. Het opnieuw gebruiken van de stukjes code in een programma bespaart tijd. Het voorkomt dat de programmeur de code meerdere keren herschrijft. Voor programmeurs bieden bibliotheken herbruikbare functies, datastructuren, klassen enzovoort.

“als je bijvoorbeeld een applicatie bouwt die wiskundige bewerkingen moet uitvoeren, hoef je daar geen nieuwe wiskundige functie voor te maken, je kunt gewoon bestaande functies in bibliotheken gebruiken voor die programmeertaal.”(“Gedeelde bibliotheken in Linux begrijpen”)

een bibliotheek is niet uitvoerbaar en dat is een belangrijk verschil met processen en toepassingen. Bibliotheken spelen hun rol tijdens runtime of compileertijd. In de programmeertaal C hebben we twee soorten bibliotheken: dynamische bibliotheken en statische bibliotheken.

bibliotheken hebben objectbestanden aangemaakt met "-c" gcc flag en eindigen op ".o" volgens de conventie. Ze zijn het resultaat van de uitvoer van de compiler en bevatten functiedefinities in binaire vorm.

verschillen tussen dynamische en statische bibliotheken

dynamische bibliotheken hebben een”*. dus ” naamgevingsconventie en statische bibliotheken hebben een “*.een”.

dynamische of gedeelde bibliotheken treden op als afzonderlijke bestanden buiten de uitvoerbare bestanden. Het heeft dus slechts één kopie nodig van de bestanden van de bibliotheek tijdens runtime. Tijdens het compileren blijven statische bibliotheken opgesloten in een programma. Het bevat de programma ‘ s van het bestand met een kopie van de bestanden van de bibliotheek tijdens het compileren.

wanneer een dynamische bibliotheek wordt gebruikt, verwijst de programmeur naar die bibliotheek Wanneer het nodig is tijdens runtime. Als u bijvoorbeeld toegang wilt krijgen tot de functie tekenreekslengte van standard input/output header file, kunt u deze dynamisch benaderen. Het zal de bibliotheekreferentie van het programma tijdens runtime vinden vanwege de dynamische Lader. Het laadt dan die string lengte functie in het geheugen. De dynamische bibliotheektoegankelijkheid moet dus direct beschikbaar zijn, anders wordt deze machteloos.

voor-en nadelen van dynamische bibliotheken

  1. het heeft slechts één kopie nodig tijdens runtime. Het is afhankelijk van de applicatie en de bibliotheek die nauw voor elkaar beschikbaar zijn.
  2. meerdere actieve toepassingen gebruiken dezelfde bibliotheek zonder dat elk bestand een eigen kopie hoeft te hebben.
  3. maar wat als de dynamische bibliotheek corrupt wordt? Het uitvoerbare bestand werkt mogelijk niet omdat het buiten het uitvoerbare bestand leeft en kwetsbaar is voor breken.
  4. ze bevatten kleinere bestanden.
  5. dynamische bibliotheken zijn gekoppeld tijdens runtime. Het vereist geen hercompilatie en herlinking wanneer de programmeur een wijziging maakt.

tijdens het compileren maken toepassingen gebruik van statische bibliotheken. Alle kopieën van de functies krijgen geplaatst in het applicatiebestand omdat ze nodig zijn om het proces uit te voeren.

voor-en nadelen van statische bibliotheken

  1. statische bibliotheken zijn bestand tegen kwetsbaarheid omdat ze zich in het uitvoerbare bestand bevinden.
  2. de snelheid tijdens het draaien komt sneller omdat de objectcode (binair) zich in het uitvoerbare bestand bevindt. Zo worden oproepen naar de functies sneller uitgevoerd. Vergeet niet dat de dynamische bibliotheek buiten het uitvoerbare bestand staat, dus oproepen worden gedaan vanaf de buitenkant van het uitvoerbare bestand.
  3. wijzigingen in de bestanden en het programma vereisen herlinking en hercompilatie.
  4. Bestandsgrootte is veel groter.

Hoe creëer je een statische en dynamische bibliotheek?

voor beide bibliotheken moet uw programma een prototype bevatten voor elk van de functies die in uw bibliotheek bestaan. Als u een header-bestand gebruikt, vergeet dan niet de header filenameop te nemen.

#include "<header file name>"

dynamische bibliotheken

schrijf het volgende commando om een dynamische bibliotheek te maken:

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

met de "*.c" — neemt het alle C bronbestanden in de huidige directory en maakt het een gedeelde bibliotheek genaamd "liball.so." met de -fPIC vlag kan naar de volgende code worden verwezen op elk virtueel adres tijdens runtime. Het staat voor positie onafhankelijke Code.De bibliotheek bevat geen gegevens op vaste adressen omdat de locatie in het geheugen zal veranderen tussen programma ‘ s. Objectbestanden worden gecompileerd met -shared flag. De compiler zal later een bibliotheek identificeren door te zoeken naar bestanden die beginnen met "lib" en eindigen met de naamgevingsconventie, .so

het programma heeft het pad nodig om naar de bibliotheekbestanden te zoeken. Dus, moet u het volgende commando te typen om die locatie toe te voegen aan de omgevingsvariabele genaamd LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

typ bij gebruik van de dynamische bibliotheek de volgende opdracht:

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

statische bibliotheken

om een statische bibliotheek te maken, moeten we het volgende commando gebruiken:

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

"ar" staat voor archive en wordt gebruikt om de statische bibliotheek aan te maken. Alle bestanden die eindigen op ".o" worden toegevoegd aan de liball.a library en dit zijn de objectbestanden in dit geval.

de -rc flag zal twee dingen doen: een nieuwe bibliotheek vervangen en aanmaken als deze nog niet bestaat. De volgende stap is indexeren, om dat te doen, typen we:

ranlib liball.a

typ bij gebruik van de statische bibliotheek de volgende opdracht:

gcc main.c -L -l<filename>

de -L flag maakt gebruik van de linker zodat de bibliotheken in de opgegeven map kunnen worden gevonden. Ook, het zoekt ook naar andere locaties waar de compiler zoekt naar systeembibliotheken.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.