Linker, loader en uitvoerbare formaten

Bij het disassembleren van een objectbestand bleek het sprongdoel van de instructie die de externe functie printf aanroept een voorlopige waarde zoals 0 te zijn. Wanneer wordt deze waarde juist ingevuld?

  1. AHet is een compilerfout en kan alleen worden ingevuld als de broncode wordt gecorrigeerd
  2. BOp het moment dat de CPU de instructie uitvoert, wordt het sprongdoel geraden en bepaald
  3. CBij het linken (bij dynamisch linken deels tijdens uitvoering) op basis van de relocatie-informatie
Antwoord en toelichting tonen

Antwoord: C. Bij het linken (bij dynamisch linken deels tijdens uitvoering) op basis van de relocatie-informatie

Op het moment van compileren is het adres van printf onbekend, dus zet de compiler het sprongdoel op een voorlopige waarde en laat relocatie-informatie achter dat „in dit veld van deze instructie het adres van printf moet komen”. De linker ziet dat en schrijft de juiste waarde. Bij dynamisch linken wordt het omgeschreven naar een verwijzing naar de PLT-ingang, en het werkelijke adres van de bibliotheekfunctie wordt tijdens uitvoering door de dynamische linker in de GOT gezet.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Linker, loader en uitvoerbare formaten

  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?
  3. Wat is het juiste verschil tussen „sectie” en „segment” in een ELF-bestand?
  4. Welke aanval is gemakkelijker te voorkomen door te verbieden dat een geheugenpagina tegelijk „beschrijfbaar” en „uitvoerbaar” is (W^X, scheiding van schrijven en uitvoeren)?
  5. Wanneer wordt bij gedeelde bibliotheken op Linux het versienummer van de soname, zoals de „.1” in libfoo.so.1, in het algemeen verhoogd?

Vergelijkingen bij dit onderwerp