En général, les programmes ne sont pas compatibles en raison des différences dans leur interface binaire d'application (ABI) .
Le programme ne s'exécute-t-il pas directement sur le CPU?
NON ! C'est le travail du système d'exploitation, d' empêcher les applications de s'exécuter "directement" sur le CPU. En règle générale, au niveau le plus bas (c'est-à-dire celui sur lequel l'API du système d'exploitation est construit), une application s'interface avec le noyau du système d' exploitation .
Est-ce parce que le programme compilé lui-même doit référencer des bibliothèques spécifiques au système d'exploitation?
Oui . De nombreuses bibliothèques de système d'exploitation sont écrites pour faciliter l'interfaçage avec le système d'exploitation lui-même, mais il y en a autant qui sont écrites pour être multiplateforme. Celles-ci masquent l'interface du système d'exploitation de bas niveau au développeur et supposent que la version compilée pour ce système d'exploitation sera disponible au moment de l'exécution (voir ci-dessous).
Bien que les bibliothèques puissent être écrites de manière multiplateforme, lorsqu'elles sont compilées, elles ne peuvent pas être exécutées multiplateforme. Ils doivent encore être recompilés pour le système d'exploitation cible spécifique, encore une fois pour utiliser les composants sous-jacents particuliers du système d'exploitation (noyau).
Quelle est la différence entre un programme compilé pour un OS et un autre?
Enfin, les fichiers exécutables eux-mêmes contiennent souvent des en-têtes de chargement binaires très spécifiques, etc. (par exemple le format de fichier exécutable PE [.exe, .dll, etc ...] pour Windows ou ELF pour Linux [none, .o, .so , etc...]). Ceux-ci peuvent également inclure du code pour charger les fichiers binaires spécifiques au système d'exploitation compilés pour une bibliothèque de logiciels particulière.
Enfin, du point de vue d'un programmeur: convention d'appel . Le code compilé transmet les variables aux fonctions d'une manière donnée (c'est-à-dire via des registres ou sur la pile) dans un ordre très particulier. Même alors, il faut également convenir de qui est responsable du "nettoyage" des appels de fonction (l'appelant ou l'appelé?). Bien qu'il existe plusieurs conventions d'appel x86 standard et largement utilisées , certaines peuvent ne pas être prises en charge par certains systèmes d'exploitation (cela fait partie de l'ABI).