Linker, loader en uitvoerbare formaten

Het uitvoeren van het C-fragment „char *p = "hello"; p[0] = 'H';” leidt in veel omgevingen tot abnormale beëindiging. Wat is de juiste reden?

  1. ADe tekenreeks stond op de stack en was verdwenen doordat de functie was teruggekeerd
  2. BEen stringliteral staat in de tegen schrijven beveiligde .rodata en er werd geprobeerd daarin te schrijven
  3. Cp was met 0 geïnitialiseerd
Antwoord en toelichting tonen

Antwoord: B. Een stringliteral staat in de tegen schrijven beveiligde .rodata en er werd geprobeerd daarin te schrijven

Stringliterals zoals "hello" en globale constanten met const komen in een alleen-lezen datagebied (.rodata). Omdat schrijven naar deze pagina is verboden, detecteert de CPU bij een schrijfpoging een beveiligingsschending en stopt het OS het programma (segmentation fault). Wil men herschrijven, dan kan met een array, „char s[] = "hello";”, een kopie in een beschrijfbaar gebied worden gemaakt.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Linker, loader en uitvoerbare formaten

  1. Welke combinatie van de bovenstaande globale variabelen staat in het algemeen in de .bss-sectie?
  2. Waar wordt tijdens uitvoering een in een C-functie gedeclareerde lokale variabele (automatische variabele) zonder static geplaatst?
  3. Uit welk gebied van het proces wordt het met malloc in C gereserveerde geheugen in het algemeen genomen?
  4. Welke volgorde van de geheugenindeling van een gangbaar proces op Linux en dergelijke, van laag naar hoog adres, is juist?
  5. Welk voordeel is juist van de indeling waarin heap en stack van een proces in tegengestelde richting groeien met ertussen een breed vrij gebied?

Vergelijkingen bij dit onderwerp