Statisch versus dynamisch linken: manieren om bibliotheken te koppelen vergeleken

Linken koppelt gecompileerde code aan de code van de bibliotheken die ze gebruikt. Bij statisch linken wordt de benodigde bibliotheekcode tijdens het bouwen in het uitvoerbare bestand gekopieerd, zodat het programma op zichzelf staat. Bij dynamisch linken noteert het uitvoerbare bestand alleen welke gedeelde bibliotheken nodig zijn en laadt het besturingssysteem die bij het starten van het programma, zodat veel programma's één kopie delen. Statisch is eenvoudiger te distribueren, dynamisch bespaart geheugen en is gemakkelijker bij te werken.

KenmerkStatisch linkenDynamisch linken
WanneerTijdens het bouwen. De bibliotheekcode wordt in het uitvoerbare bestand gekopieerdBij het laden of tijdens runtime. De dynamische linker zoekt gedeelde bibliotheken (.so, .dll) en mapt ze
Grootte van het uitvoerbare bestandGrootKlein
GeheugengebruikElk programma heeft een eigen kopie van de bibliotheekcodeEén kopie van de gedeelde bibliotheek kan door veel processen worden gedeeld
Updates en beveiligingsfixesHet programma moet opnieuw worden gebouwd en gedistribueerdEén update van de bibliotheek werkt door zonder opnieuw te bouwen (mits de interface compatibel is)
OpstarttijdIets snellerIets langzamer. Symbolen moeten worden opgelost (vaak uitgesteld)
DistributieOp zichzelf staand. Werkt ook als de bibliotheek niet is geïnstalleerdHet doelsysteem heeft de juiste versie van de bibliotheek nodig. Zonder start het programma niet
Kosten tijdens runtimeOptimalisatie van het hele programma en directe aanroepen zijn mogelijkIndirecte aanroepen via GOT en PLT geven een kleine overhead
VersieproblemenGeen tijdens runtimeEen mismatch tussen het programma en de geïnstalleerde bibliotheek is mogelijk
Belangrijkste toepassingenEmbedded firmware, tools uit één bestand, minimale containersDe meeste programma's op algemene besturingssystemen, plug-ins, systeembibliotheken zoals libc

De getalswaarden zijn typische ordegroottes en variëren per procesgeneratie en product.

Wanneer welke variant?

Statisch
Wanneer een op zichzelf staand binary gewenst is dat overal draait, of wanneer er geen loader van het besturingssysteem is, zoals bij embedded firmware.
Dynamisch
Wanneer veel programma's dezelfde bibliotheek delen, geheugen moet worden bespaard en bibliotheken centraal moeten kunnen worden gerepareerd.

Veelgestelde vragen

Waarom start een programma niet met de foutmelding dat een bibliotheek ontbreekt?

Omdat het dynamisch is gelinkt en de benodigde gedeelde bibliotheek (een .so- of .dll-bestand) niet op de computer is geïnstalleerd. Installeer de bibliotheek of link statisch.

Bespaart dynamisch linken geheugen?

Ja. Eén kopie van de gedeelde bibliotheek kan door veel processen worden gedeeld.

Is statisch linken sneller?

Iets. Er is geen symboolresolutie bij het opstarten en geen indirecte aanroepen via GOT en PLT, en optimalisatie van het hele programma is mogelijk.

Waarom helpt dynamisch linken bij beveiligingsupdates?

Omdat één fix in de gedeelde bibliotheek ten goede komt aan alle programma's die haar gebruiken, zonder dat ze opnieuw hoeven te worden gebouwd.

Test uw begrip

Welke omschrijving van statisch linken is juist?

  1. ADe code van de gebruikte bibliotheken wordt in het uitvoerbare bestand gekopieerd en daarmee samengevoegd
  2. BBij elke uitvoering van het programma worden de bibliotheken geladen en gekoppeld
  3. CEr worden geen bibliotheken gebruikt en alle verwerking staat in één bronbestand
Antwoord en toelichting tonen

Antwoord: A. De code van de gebruikte bibliotheken wordt in het uitvoerbare bestand gekopieerd en daarmee samengevoegd

Bij statisch linken haalt de linker de benodigde functies uit een statische bibliotheek (op Linux een .a-bestand) en bouwt die in het uitvoerbare bestand in. Het werkt ook als de bibliotheek in de uitvoeromgeving ontbreekt en er is geen koppelwerk bij het opstarten, maar het uitvoerbare bestand wordt groot en elk programma dat dezelfde bibliotheek gebruikt, heeft een eigen kopie. Ook als een fout in de bibliotheek is verholpen, wordt dat pas verwerkt na opnieuw bouwen.

Welk voordeel van dynamisch linken (gedeelde bibliotheken) is juist?

  1. AHet werkt altijd, ook als de bibliotheek in de uitvoeromgeving ontbreekt
  2. BMeerdere programma's kunnen één bibliotheek in het geheugen delen, en bij een update van de bibliotheek wordt de correctie zonder opnieuw bouwen verwerkt
  3. COpstartverwerking is helemaal niet meer nodig en het start altijd sneller dan statisch linken
Antwoord en toelichting tonen

Antwoord: B. Meerdere programma's kunnen één bibliotheek in het geheugen delen, en bij een update van de bibliotheek wordt de correctie zonder opnieuw bouwen verwerkt

Bij dynamisch linken legt het uitvoerbare bestand alleen vast „welke functie van welke gedeelde bibliotheek wordt gebruikt”, en tijdens uitvoering laadt de dynamische linker de bibliotheek en koppelt die. Omdat de code van een gedeelde bibliotheek niet wordt herschreven, kan één kopie in het fysieke geheugen door veel processen worden gedeeld. Ook correcties van fouten en kwetsbaarheden vereisen alleen het vervangen van de bibliotheek. Het koppelen kost bij het opstarten echter moeite.

Een dynamisch gelinkt programma werd naar een andere computer gekopieerd en uitgevoerd, maar startte niet. Wat is de meest waarschijnlijke oorzaak?

  1. AHet uitvoerbare bestand bevatte alle bibliotheekcode en was te groot
  2. BDynamisch gelinkte programma's werken per regel alleen op de computer waarop ze zijn gemaakt
  3. CDe benodigde gedeelde bibliotheek is niet aanwezig of er is alleen een incompatibele versie
Antwoord en toelichting tonen

Antwoord: C. De benodigde gedeelde bibliotheek is niet aanwezig of er is alleen een incompatibele versie

Een dynamisch gelinkt programma gebruikt de gedeelde bibliotheken die op de computer waarop het draait aanwezig zijn. Als de benodigde bibliotheek ontbreekt of alleen een oude versie aanwezig is waarin functies ontbreken, kan de dynamische linker niet koppelen en mislukt het starten. Op Linux kan met het commando ldd worden gecontroleerd welke gedeelde bibliotheken een programma nodig heeft en of ze worden gevonden. Soms wordt om de verspreiding te vergemakkelijken bewust statisch gelinkt.

  1. Wat bouwt de linker in het uitvoerbare bestand in als er samen met een statische bibliotheek (.a-bestand) wordt gelinkt?
  2. Wat is de juiste rol van de GOT (global offset table) die bij gedeelde bibliotheken wordt gebruikt?
  3. Hoe wordt het fysieke geheugen gebruikt als 100 processen dezelfde gedeelde bibliotheek gebruiken?

Oefenvragen over Linker, loader en uitvoerbare formaten

Belangrijke termen uitgelegd

Statisch linken
Methode waarbij de code van gebruikte bibliotheken in het uitvoerbare bestand wordt gekopieerd en samengevoegd. Werkt ook als de bibliotheek in de uitvoeringsomgeving ontbreekt, maar het bestand wordt groot en wijzigingen aan de bibliotheek worden pas na opnieuw bouwen doorgevoerd.
Dynamisch linken
Methode waarbij gedeelde bibliotheken tijdens runtime worden geladen en gekoppeld. Bibliotheken kunnen tussen processen worden gedeeld en correcties werken door bij vervanging, maar er is een bibliotheek nodig die bij de uitvoeringsomgeving past.
Gedeelde bibliotheek (shared library)
Bibliotheek die bij dynamisch linken tijdens runtime wordt geladen. .so in Linux, .dll in Windows. Gemaakt met positie-onafhankelijke code, zodat de codepagina's door veel processen kunnen worden gedeeld.
Statische bibliotheek
Archief waarin veel objectbestanden zijn samengevoegd (.a onder Linux). Bij statisch linken haalt de linker alleen de benodigde objecten eruit en neemt die op in het uitvoerbare bestand.

Verwante vergelijkingen