Cel mai bun răspuns
Executabil portabil
Formatul Portable Executable este un format de fișier pentru executabile, cod obiect, DLL-uri, fișiere Font FON și altele utilizate în versiunile pe 32 și 64 de biți ale sistemelor de operare Windows. Formatul PE este o structură de date care încapsulează informațiile necesare pentru sistemul de încărcare a sistemului de operare Windows pentru a gestiona codul executabil împachetat.
Aceasta include referințe dinamice ale bibliotecii pentru legături, tabele de export și import API, date de gestionare a resurselor și fir -date de stocare locală (TLS). Pe sistemele de operare NT, formatul PE este utilizat pentru EXE, DLL, SYS (driver de dispozitiv) și alte tipuri de fișiere. Specificația Extensible Firmware Interface (EFI) afirmă că PE este formatul executabil standard în mediile EFI.
Răspuns
Portabilitatea codului sursă C înseamnă că, atâta timp cât platforma țintă dorită are un compilator C funcțional, puteți să vă mutați codul sursă C pe platforma țintă recompilând-o, fără a fi nevoie să o modificați. Deoarece aproape fiecare platformă țintă are un compilator C disponibil pentru aceasta, C este considerat un limbaj de programare foarte portabil.
Acestea fiind spuse, simpla scriere a codului în C face nu garantează portabilitatea. Trebuie să exercitați disciplina pentru a evita scrierea unui cod care nu este portabil. De exemplu, scrierea unui cod care face oricare dintre următoarele va avea ca rezultat un cod neportabil:
- Face presupuneri cu privire la dimensiunile oricăror tipuri de date, altele decât caracterele.
- Face ipoteze despre modul în care datele sunt aliniate în memorie și în cadrul structurilor.
- Face ipoteze despre modul în care datele sunt împachetate / umplute în structuri.
- Face ipoteze despre ordinea octeților (endian mare vs endian mic) .
- Folosește o extensie de compilator non-standard, care ar putea să nu fie disponibilă pentru toate implementările de compilare.
- Utilizează o extensie de bibliotecă non-standard, care ar putea să nu fie disponibilă pe toate platformele.
- Se bazează pe orice comportament definit de implementare, care poate funcționa diferit într-o implementare diferită a compilatorului.
- Conține orice comportament nedefinit, care ar putea apar pentru a funcționa într-un mediu, dar s-ar putea comporta imprevizibil într-un alt mediu.
- Efectuează orice apel API (interfață de programare a aplicației) către operator , care ar putea să nu fie disponibil în toate mediile.
- Face presupuneri despre anumite adrese de memorie (de exemplu, că o anumită adresă de memorie este mapată la un registru de dispozitiv hardware etc.).
- Face presupuneri cu privire la dimensiunea unui pointer sau că un pointer are aceeași dimensiune ca un int.
- Face presupuneri cu privire la modul în care argumentele sunt transmise (pe stivă sau în registre specifice).
- Conține orice cod sursă de limbaj de asamblare în linie.
- Folosește o caracteristică cea mai recentă și cea mai mare a limbajului C care poate să nu fie încă acceptată de unele implementări ale compilatorului (și, în unele cazuri, nu ar putea fi niciodată acceptat).
- Se bazează pe o bibliotecă care face oricare dintre cele de mai sus.
Aceasta nu este o listă exhaustivă.
Dacă puteți Nu evitați utilizarea codului neportabil, atunci cel mai bun pariu este să izolați codul neportabil într-un fișier sursă separat. Apoi, când trebuie să mutați codul pe o nouă platformă țintă, este foarte clar ce subset al codului sursă trebuie modificat.