Beste svaret
Portable Executable
Portable Executable-formatet er et filformat for kjørbare filer, objektkoder, DLL-filer, FON Font-filer og andre som brukes i 32-biters og 64-biters versjoner av Windows-operativsystemer. PE-formatet er en datastruktur som innkapsler informasjonen som er nødvendig for at Windows OS-lasteren kan administrere den innpakket kjørbare koden.
Dette inkluderer dynamiske biblioteksreferanser for lenking, API-eksport og importtabeller, ressursadministrasjonsdata og tråd -lokal lagringsdata (TLS). På NT-operativsystemer brukes PE-formatet for EXE, DLL, SYS (enhetsdriver) og andre filtyper. EFI-spesifikasjonen (Extensible Firmware Interface) sier at PE er det standard kjørbare formatet i EFI-miljøer.
Svar
Portabilitet av C-kildekode betyr at så lenge ønsket målplattform har en fungerende C-kompilator tilgjengelig, kan du flytte C-kildekoden din som målplattformen, ved å kompilere den uten å måtte endre den. Fordi nesten alle målplattformer har en C-kompilator tilgjengelig for den, regnes C som et veldig bærbart programmeringsspråk.
Når det er sagt, skriver du bare kode i C ikke garanterer bærbarhet. Du må utøve disiplin for å unngå å skrive kode som ikke er bærbar. For eksempel vil skriving av kode som gjør noe av det følgende resultere i ikke-bærbar kode:
- Gjør antakelser om størrelser på alle datatyper, bortsett fra tegn.
- Gjør antagelser om hvordan data er justert i minnet og innenfor strukturer.
- Gjør antakelser om hvordan data pakkes / polstres i strukturer.
- Gjør antagelser om bytebestilling (stor endian vs liten endian) .
- Bruker en ikke-standard kompilatorutvidelse, som kanskje ikke er tilgjengelig på alle kompilatorimplementeringer.
- Bruker en ikke-standard bibliotektillegg, som kanskje ikke er tilgjengelig på alle plattformer.
- Stoler på enhver implementeringsdefinert atferd, som kan fungere annerledes i en annen implementering av kompilatoren.
- Inneholder enhver udefinert oppførsel, som kan ser ut til å jobbe i ett miljø, men kan oppføre seg uforutsigbart i et annet miljø.
- Ringer ethvert API (applikasjonsprogrammeringsgrensesnitt) til operatøren system, som kanskje ikke er tilgjengelig i alle miljøer.
- Gjør antakelser om spesifikke minneadresser (f.eks. at en spesifikk minneadresse er kartlagt til et maskinvareenhetsregister osv.).
- Gjør antakelser om størrelsen på en peker, eller at en peker er av samme størrelse som en int.
- Gjør antakelser om hvordan argumenter sendes (på bunken eller i bestemte registre).
- Inneholder hvilken som helst innebygd kildekode for forsamlingsspråk.
- Bruker en nyeste og beste funksjon i C-språket som kanskje ikke støttes av noen kompilatorimplementeringer ennå (og i noen tilfeller kanskje aldri støttes).
- Stoler på et bibliotek som gjør noe av det ovennevnte.
Dette er ikke en uttømmende liste.
Hvis du kan t unngå å bruke ikke-bærbar kode, så er det best å isolere den ikke-bærbare koden i en egen kildefil. Når du da trenger å flytte koden til en ny målplattform, er det veldig klart hvilken delmengde av kildekoden som må endres.