Linker, loader en uitvoerbare formaten

Welk mechanisme waardoor in C++ de constructors van globale objecten vóór main worden uitgevoerd, is juist?

  1. ADe CPU vindt de constructors en voert ze automatisch eerst uit
  2. BDe compiler schrijft in de eerste regel van main altijd alle constructors over
  3. CDe adressen van de functies die constructors aanroepen worden in een tabel zoals .init_array verzameld en de opstartcode roept ze vóór main achter elkaar aan
Antwoord en toelichting tonen

Antwoord: C. De adressen van de functies die constructors aanroepen worden in een tabel zoals .init_array verzameld en de opstartcode roept ze vóór main achter elkaar aan

De compiler maakt voor elk bestand een functie die globale objecten initialiseert en zet het adres daarvan in een speciale sectie, .init_array. De linker voegt de .init_array van alle bestanden samen tot één tabel, en de opstartcode of de dynamische linker roept de functies in deze tabel vóór main achter elkaar aan. De verwerking bij beëindiging wordt omgekeerd verzameld in .fini_array. De volgorde van initialisatie over bestanden heen staat niet vast, dus men moet erop letten er geen afhankelijkheid van te maken.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Linker, loader en uitvoerbare formaten

  1. Welke uitspraak over het objectbestand (.o) dat de compiler uit één bronbestand voortbrengt, is juist?
  2. Wat is de juiste hoofdtaak van de linker?
  3. Welke omschrijving van de symboolresolutie die de linker uitvoert, is juist?
  4. Welke omschrijving van de relocatie die de linker uitvoert, is juist?
  5. Bij het linken van een C-programma verschijnt de fout „undefined reference to `foo'”. Wat is de meest waarschijnlijke oorzaak?

Vergelijkingen bij dit onderwerp