Wat is Linkerscript?

Bestand dat de linker instrueert op welke geheugenadressen elke sectie wordt geplaatst. Wordt bij embedded-ontwikkeling gebruikt om de plaatsing in flash en RAM en het adres van de interruptvector te bepalen.

Japanse benaming: リンカスクリプト

“Linkerscript” komt voor in 2 oefenvragen uit 1 onderwerpen, bijv. Linker, loader en uitvoerbare formaten.

Vakgebied: Linker, loader en uitvoerbare formaten

Wat een linkerscript beschrijft

De compiler produceert objectbestanden waarvan code en data zijn gegroepeerd in secties zoals .text (instructies), .rodata (constanten), .data (geïnitialiseerde variabelen) en .bss (met nul geïnitialiseerde variabelen), maar zonder definitieve adressen. Een linkerscript vertelt de linker hoe hij ze moet combineren. In de syntaxis van GNU ld declareert een MEMORY-blok gebieden met een beginadres (origin) en lengte, bijvoorbeeld flash op het ene adres en RAM op een ander, en een SECTIONS-blok mapt invoersecties naar uitvoersecties en wijst elk daarvan aan een gebied toe. De linker geeft een fout als een gebied overloopt.

Waarom embedded systemen er een nodig hebben

Op een pc bepaalt de loader van het besturingssysteem waar een programma in het geheugen staat, en een standaard-linkerscript werkt voor vrijwel alles. Een microcontroller zonder OS begint bij het inschakelen met uitvoeren vanaf vaste adressen, dus het programma moet voor de exacte geheugenindeling worden gebouwd. De interruptvectortabel moet staan waar de hardware haar verwacht, code en constanten horen in niet-vluchtig flashgeheugen, en beschrijfbare variabelen, de heap en de stack moeten in RAM staan. Verschillende chips uit dezelfde familie hebben vaak alleen een ander linkerscript nodig, omdat hun geheugengroottes verschillen.

Laadadres vs. uitvoeradres

Geïnitialiseerde variabelen vormen een bijzonder probleem: hun beginwaarden moeten het uitschakelen overleven en worden dus in flash opgeslagen, maar het programma schrijft ernaar en dus moeten ze tijdens runtime in RAM staan. Het linkerscript geeft .data daarom twee adressen: een laadadres in flash en een uitvoeradres (run address) in RAM. Het definieert ook symbolen die het begin en einde van .data en .bss markeren, en vaak de top van de stack. De opstartcode gebruikt die symbolen om .data van flash naar RAM te kopiëren en .bss met nullen te vullen vóór de aanroep van main, zodat C de beloofde begintoestand krijgt.

Veelvoorkomende valkuilen

Veel problemen in bare-metalprojecten zijn terug te voeren op het linkerscript. Als het verwijderen van ongebruikte secties is ingeschakeld, kunnen de vectortabel of andere secties waarnaar alleen de hardware verwijst worden weggegooid, tenzij ze als te behouden zijn gemarkeerd. Een te klein gedimensioneerd stackgebied geeft geen linkfout, maar overschrijft tijdens runtime ongemerkt andere data. Een sectie op het verkeerde laadadres plaatsen geeft variabelen willekeurige beginwaarden. De standaardmanier om het resultaat te controleren is de mapfile lezen die de linker kan genereren, met het adres van elk symbool en het gebruik van elk gebied.

Nu oefenen: vragen over Linkerscript

Wat is de juiste rol van het linkerscript dat bij embedded ontwikkeling wordt gebruikt?

  1. ADe linker aangeven op welk adres elke sectie wordt geplaatst, zoals flash of RAM
  2. BDe procedure beschrijven om programmatests automatisch uit te voeren
  3. CRegels voor het schrijven van broncode vaststellen en overtredingen melden
Antwoord en toelichting tonen

Antwoord: A. De linker aangeven op welk adres elke sectie wordt geplaatst, zoals flash of RAM

Bij een pc-OS bepaalt de loader de adressen, maar bij een microcontroller worden de adressen op het moment van inschakelen ongewijzigd gebruikt. In het linkerscript staan het beginadres en de grootte van flash en RAM en wordt de indeling opgegeven, zoals .text en constanten in flash en .data, .bss en stack in RAM. Ook zaken die op een vast adres moeten staan, zoals de interruptvectoren, worden hier opgegeven.

Veelgestelde vragen

Waarvoor wordt een linkerscript gebruikt?

Een linkerscript vertelt de linker welke geheugengebieden er zijn en op welke adressen elke code- en datasectie moet worden geplaatst. Embedded projecten gebruiken het om code in flash, variabelen in RAM en de interruptvectortabel op het vereiste adres te zetten.

Wat is het verschil tussen .data en .bss?

.data bevat variabelen met een beginwaarde ongelijk aan nul, die in flash worden opgeslagen en bij het opstarten naar RAM worden gekopieerd. .bss bevat variabelen die op nul beginnen, dus neemt geen ruimte in flash in en wordt vóór main simpelweg in RAM leeggemaakt.

Waarom heeft .data twee adressen in een linkerscript?

De beginwaarden moeten in niet-vluchtig flashgeheugen worden opgeslagen, maar de variabelen worden tijdens runtime gewijzigd en moeten dus in RAM staan. Het laadadres wijst naar de kopie in flash en het uitvoeradres naar de plek in RAM die de code daadwerkelijk gebruikt.

“Linkerscript” in de toelichting

Vragen met “Linkerscript” (2)

  1. Wat is de juiste rol van het linkerscript dat bij embedded ontwikkeling wordt gebruikt?
  2. Wat is de juiste verwerking die de opstartcode direct na het inschakelen uitvoert voordat main wordt aangeroepen op een microcontroller zonder OS?

Verwante termen

Microcontroller (MCU) Loader Numerieke apertuur (NA) ASLR BSS-sectie Dynamisch linken Dynamische linker ELF Entry point Fragmentatie

Naar de woordenlijst