Wat is BSS-sectie?

Gebied voor globale en statische variabelen zonder beginwaarde (of met waarde 0). In het bestand wordt alleen de grootte vastgelegd en bij het laden wordt het met nullen gevuld, zodat het uitvoerbare bestand niet groter wordt.

Japanse benaming: BSSセクション

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

Vakgebied: Linker, loader en uitvoerbare formaten

Wat er in .bss terechtkomt

De taal C vereist dat elk object met statische opslagduur, dus globale en statische variabelen, op nul begint als er geen initializer is opgegeven. Compilers plaatsen zulke variabelen, en meestal ook variabelen die expliciet op 0 zijn geïnitialiseerd, in de .bss-sectie. Globale variabelen met een beginwaarde ongelijk aan nul gaan naar .data, en const-constanten naar de read-only sectie .rodata. Het sleutelwoord static bepaalt niet de sectie; het beperkt alleen de zichtbaarheid tot één bestand. Lokale automatische variabelen komen nooit in .bss terecht, omdat ze op de stack staan en geen gedefinieerde beginwaarde hebben.

Waarom .bss geen bestandsruimte kost

Een lange reeks nullen in het uitvoerbare bestand opslaan zou alleen schijfruimte en laadtijd verspillen, dus de .bss-sectie legt alleen haar grootte en uitlijning vast. In ELF is ze gemarkeerd als sectie die geen bytes in het bestand inneemt. De loader mapt het read-write-segment met .data en .bss, en waar de geheugengrootte van het segment groter is dan zijn bestandsgrootte, worden de extra bytes geleverd als met nullen gevulde pagina's. Daardoor voegt een declaratie als static char buf[1000000]; ongeveer 1 MB toe aan het geheugengebruik, maar vrijwel niets aan het bestand.

BSS op embedded systemen

Op een microcontroller zonder besturingssysteem vult niemand anders het geheugen met nullen, dus doet de opstartcode dat. Vóór de aanroep van main kopieert de reset-handler doorgaans de beginwaarden van .data van flash naar RAM en maakt hij het .bss-bereik in RAM leeg, met begin- en eindadressen die het linkerscript als symbolen exporteert. Wie een van beide stappen vergeet, krijgt globale variabelen met willekeurige waarden. Tools zoals het commando size rapporteren text, data en bss apart, wat helpt om het flash- en RAM-gebruik in te schatten.

Waar de naam vandaan komt

BSS wordt meestal uitgelegd als block started by symbol, een naam die is overgenomen van een assemblerdirectief op vroege IBM-mainframes waarmee onder een label een niet-geïnitialiseerd geheugenblok werd gereserveerd. De betekenis bleef behouden in Unix-objectformaten en later ELF, ook al is het directief zelf allang verdwenen. Tegenwoordig verwijst de naam gewoon naar de sectie voor met nul geïnitialiseerde data, naast .text voor code, .data voor geïnitialiseerde data en .rodata voor constanten.

Nu oefenen: vragen over BSS-sectie

Welke eigenschap van de .bss-sectie is juist?

  1. AHet is het gebied waar lokale variabelen van een functie bij elke aanroep worden geplaatst
  2. BHet is het gebied voor variabelen zonder beginwaarde (of met 0); in het bestand wordt alleen de grootte vastgelegd en bij het laden wordt het met 0 gevuld
  3. CHet is een niet-beschrijfbaar gebied waar constante tekenreeksen staan
Antwoord en toelichting tonen

Antwoord: B. Het is het gebied voor variabelen zonder beginwaarde (of met 0); in het bestand wordt alleen de grootte vastgelegd en bij het laden wordt het met 0 gevuld

Globale en statische variabelen waarvoor geen beginwaarde is geschreven, beginnen volgens de regels van C op 0. Als de inhoud geheel uit nullen bestaat, is het verspilling om nullen in het bestand op te slaan, dus legt de .bss-sectie alleen de grootte vast en reserveert de loader geheugen en vult dat met 0. Bij bijvoorbeeld „static char buf[1000000];” wordt het uitvoerbare bestand niet 1 MB groter.

Veelgestelde vragen

Waar staat BSS voor?

BSS wordt meestal uitgelegd als block started by symbol, naar een oud assemblerdirectief. In moderne toolchains is het gewoon de naam van de sectie voor met nul geïnitialiseerde globale en statische variabelen.

Maakt een grote niet-geïnitialiseerde array het uitvoerbare bestand groter?

Nee. Een globale of statische array zonder initializer komt in .bss terecht, waar alleen de grootte wordt vastgelegd; het geheugen wordt gealloceerd en met nullen gevuld wanneer het programma wordt geladen.

Wat is het verschil tussen .data en .bss?

De .data-sectie bevat globale en statische variabelen met een beginwaarde ongelijk aan nul, die in het bestand moeten worden opgeslagen. De .bss-sectie bevat de variabelen die op nul beginnen, zodat ze tijdens runtime geheugen inneemt maar in het bestand geen ruimte voor inhoud.

“BSS-sectie” in de toelichting

Vragen met “BSS-sectie” (2)

  1. Welke eigenschap van de .bss-sectie is juist?
  2. Welke combinatie van de bovenstaande globale variabelen staat in het algemeen in de .bss-sectie?

Verwante termen

Loader ASLR Dynamisch linken Dynamische linker ELF Entry point Fragmentatie Gedeelde bibliotheek (shared library) GOT (global offset table) Heap

Naar de woordenlijst