Beste antwoord
Portable Executable
De Portable Executable-indeling is een bestandsindeling voor uitvoerbare bestanden, objectcode, DLLs, FON-lettertypebestanden en andere die worden gebruikt in 32-bits en 64-bits versies van Windows-besturingssystemen. Het PE-formaat is een datastructuur die de informatie bevat die nodig is voor de Windows OS-lader om de ingepakte uitvoerbare code te beheren.
Dit omvat dynamische bibliotheekreferenties voor het koppelen, API-export- en importtabellen, gegevens voor resourcebeheer en thread -lokale opslag (TLS) gegevens. Op NT-besturingssystemen wordt het PE-formaat gebruikt voor EXE, DLL, SYS (apparaatstuurprogramma) en andere bestandstypen. De Extensible Firmware Interface (EFI) -specificatie stelt dat PE het standaard uitvoerbare formaat is in EFI-omgevingen.
Antwoord
Draagbaarheid van C-broncode betekent dat, zolang het gewenste doelplatform heeft een werkende C-compiler beschikbaar, kunt u uw C-broncode naar het doelplatform verplaatsen door het opnieuw te compileren, zonder deze te hoeven wijzigen. Omdat voor bijna elk doelplatform een C-compiler beschikbaar is, wordt C beschouwd als een zeer draagbare programmeertaal.
Dat gezegd hebbende, het schrijven van code in C doet geen garantie voor draagbaarheid. U moet discipline oefenen om te voorkomen dat u code schrijft die niet draagbaar is. Als je bijvoorbeeld code schrijft die een van de volgende dingen doet, zal dit resulteren in niet-draagbare code:
- Doet aannames over de grootte van elk gegevenstype, behalve char.
- Maakt aannames over hoe gegevens zijn uitgelijnd in het geheugen en binnen structuren.
- Maakt aannames over hoe gegevens worden verpakt / opgevuld binnen structuren.
- Maakt aannames over de volgorde van bytes (big endian versus little endian) .
- Gebruikt een niet-standaard compilerextensie, die mogelijk niet beschikbaar is op alle compilerimplementaties.
- Gebruikt een niet-standaard bibliotheekextensie, die mogelijk niet beschikbaar is op alle platforms.
- Is afhankelijk van elk door de implementatie gedefinieerd gedrag, dat anders kan werken in een andere implementatie van de compiler.
- Bevat elk ongedefinieerd gedrag, dat lijken te werken in de ene omgeving, maar kunnen zich onvoorspelbaar gedragen in een andere omgeving.
- Voert elke API (Application Programming Interface) aanroepen uit naar de systeem, dat mogelijk niet in alle omgevingen beschikbaar is.
- Doet aannames over specifieke geheugenadressen (bijv. dat een specifiek geheugenadres wordt toegewezen aan een hardware-apparaatregister, enz.).
- Neemt aannames over de grootte van een pointer, of dat een pointer even groot is als een int.
- Doet aannames over hoe argumenten worden doorgegeven (op de stapel of in specifieke registers).
- Bevat elke inline assembleertaal broncode.
- Gebruikt een nieuwste en beste functie van de C-taal die mogelijk nog niet wordt ondersteund door sommige compilerimplementaties (en in sommige gevallen misschien nooit ondersteund).
- Vertrouwt op een bibliotheek die het bovenstaande doet.
Dit is geen volledige lijst.
Als je kunt Om het gebruik van niet-draagbare code te vermijden, kun je het beste die niet-draagbare code isoleren in een apart bronbestand. Wanneer u de code vervolgens naar een nieuw doelplatform moet verplaatsen, is het heel duidelijk welke subset van de broncode moet worden gewijzigd.