Migliore risposta
Eseguibile portatile
Il formato Portable Executable è un formato di file per eseguibili, codice oggetto, DLL, file di caratteri FON e altri utilizzati nelle versioni a 32 e 64 bit dei sistemi operativi Windows. Il formato PE è una struttura di dati che incapsula le informazioni necessarie al caricatore del sistema operativo Windows per gestire il codice eseguibile avvolto.
Ciò include riferimenti di libreria dinamica per il collegamento, esportazione di API e tabelle di importazione, dati di gestione delle risorse e thread dati di archiviazione locale (TLS). Nei sistemi operativi NT, il formato PE viene utilizzato per EXE, DLL, SYS (driver di dispositivo) e altri tipi di file. La specifica EFI (Extensible Firmware Interface) afferma che PE è il formato eseguibile standard negli ambienti EFI.
Risposta
Portabilità del codice sorgente C significa che, purché la piattaforma di destinazione desiderata ha a disposizione un compilatore C funzionante, puoi spostare il tuo codice sorgente C su quella piattaforma di destinazione ricompilandolo, senza doverlo modificare. Poiché quasi ogni piattaforma di destinazione ha un compilatore C disponibile, C è considerato un linguaggio di programmazione molto portabile.
Detto questo, la semplice scrittura di codice in C fa non garantisce la portabilità. È necessario esercitare la disciplina per evitare di scrivere codice non portabile. Ad esempio, la scrittura di codice che esegue una delle seguenti operazioni risulterà in codice non portabile:
- Presuppone le dimensioni di qualsiasi tipo di dati, diverso da char.
- Rende ipotesi su come i dati sono allineati nella memoria e allinterno delle strutture.
- Fa supposizioni su come i dati vengono compressi / riempiti allinterno delle strutture.
- Fa supposizioni sullordinamento dei byte (big endian vs little endian) .
- Utilizza unestensione del compilatore non standard, che potrebbe non essere disponibile su tutte le implementazioni del compilatore.
- Utilizza unestensione della libreria non standard, che potrebbe non essere disponibile su tutte le piattaforme.
- Si basa su qualsiasi comportamento definito dallimplementazione, che può funzionare in modo diverso in unimplementazione del compilatore diversa.
- Contiene qualsiasi comportamento non definito, che potrebbe sembra funzionare in un ambiente, ma potrebbe comportarsi in modo imprevedibile in un altro ambiente.
- Effettua tutte le chiamate API (interfaccia di programmazione dellapplicazione) al sistema, che potrebbe non essere disponibile in tutti gli ambienti.
- Presuppone indirizzi di memoria specifici (ad esempio, che un indirizzo di memoria specifico sia mappato su un registro di dispositivo hardware, ecc.).
- Assume le dimensioni di un puntatore o che un puntatore abbia le stesse dimensioni di un int.
- Assume come vengono passati gli argomenti (nello stack o in registri specifici).
- Contiene qualsiasi codice sorgente del linguaggio assembly inline.
- Utilizza una funzionalità più recente e più grande del linguaggio C che potrebbe non essere ancora supportata da alcune implementazioni del compilatore (e, in alcuni casi, potrebbe non essere mai supportato).
- Si basa su una libreria che esegue una delle operazioni precedenti.
Questo non è un elenco esaustivo.
Se puoi ” Per evitare di utilizzare codice non portabile, la soluzione migliore è isolare quel codice non portabile in un file sorgente separato. Quindi, quando è necessario spostare il codice su una nuova piattaforma di destinazione, è molto chiaro quale sottoinsieme del codice sorgente deve essere modificato.