In generale, i programmi non sono compatibili a causa delle differenze nell'interfaccia binaria dell'applicazione (ABI) .
Il programma non viene eseguito direttamente sulla CPU?
NO ! Questo è il compito del sistema operativo, impedire alle applicazioni di essere eseguite "direttamente" sulla CPU. In genere, al livello più basso (ovvero quello su cui è basata l'API del sistema operativo), un'applicazione si interfaccia con il kernel del sistema operativo .
È perché lo stesso programma compilato deve fare riferimento a librerie specifiche del sistema operativo?
Sì . Molte librerie del sistema operativo sono state scritte per facilitare l'interfacciamento con il sistema operativo stesso, ma ce ne sono altrettante scritte per essere multipiattaforma. Questi nascondono l'interfaccia dello sviluppatore di basso livello dallo sviluppatore e presumono che la versione compilata per quel sistema operativo sarà disponibile in fase di esecuzione (vedi sotto).
Sebbene le librerie possano essere scritte in modo multipiattaforma, una volta compilate non possono essere eseguite multipiattaforma. Devono ancora essere ricompilati per il sistema operativo di destinazione specifico, di nuovo per utilizzare i componenti sottostanti specifici del sistema operativo (kernel).
Qual è la differenza tra un programma compilato per un sistema operativo rispetto a un altro?
Infine, i file eseguibili stessi contengono spesso intestazioni di caricamento binario molto specifiche e così via (ad esempio il formato di file eseguibile PE [.exe, .dll, ecc ...] per Windows o ELF per Linux [none, .o, .so , eccetera...]). Questi possono anche includere codice per caricare i binari compilati specifici del sistema operativo per una particolare libreria software.
Infine, dal punto di vista di un programmatore: chiamare la convenzione . Il codice compilato trasmette le variabili alle funzioni in un determinato modo (cioè attraverso registri o nello stack) in un ordine molto particolare. Anche in questo caso, deve essere concordato anche chi è il responsabile della "pulizia" delle chiamate di funzione (il chiamante o il chiamante?). Sebbene esistano diverse convenzioni di chiamata x86 standard e ampiamente utilizzate , alcune potrebbero non essere supportate da alcuni sistemi operativi (fa parte dell'ABI).