Un exécutable Linux est-il "compatible" avec OS X?
Si vous compilez un programme en C, par exemple, sur une plate-forme basée sur Linux, puis le port pour utiliser les bibliothèques MacOS, cela fonctionnera-t-il?
Le code machine de base qui provient d'un compilateur est-il compatible à la fois sur Mac et Linux?
La raison pour laquelle je demande ceci est parce que les deux sont "basés sur UNIX" donc je pense que c'est vrai, mais je ne suis pas vraiment sûr.
5 réponses
Non, les binaires Linux et Mac OS X ne sont pas compatibles entre eux.
D'une part, les exécutables Linux utilisent un format appelé ELF .
Les exécutables Mac OS X utilisent le format Mach-O .
Ainsi, même si beaucoup de bibliothèques compilent habituellement séparément sur chaque système, elles ne seraient pas portables en format binaire.
De plus, Linux n'est pas réellement basé sur UNIX. Il partage un certain nombre de fonctionnalités et d'outils communs avec UNIX, mais beaucoup de cela a à voir avec normes informatiques comme POSIX.
Modifier:
Enfin, pour répondre à votre point sur le code octet: lors de la création d'un binaire, les compilateurs génèrent généralement code machine spécifique à la plate-forme sur laquelle vous développez. (Ce n'est pas toujours le cas, mais il est généralement.)
En général, vous pouvez facilement porter un programme sur différentes marques Unix. Cependant, vous devez (au moins) le recompiler sur chaque plate-forme.
Les exécutables (binaires) ne sont pas utilisables sur plusieurs plates-formes, car un exécutable est étroitement couplé avec L'Abi du système d'exploitation (Application Binary Interface), c'est-à-dire les conventions de la façon dont une application communique avec le système d'exploitation.
Par exemple, si votre programme imprime une chaîne sur la console en utilisant POSIX write
appel, l'ABI spécifie:
- Comment un appel système est fait (Linux utilisé pour appeler l'interruption du logiciel 0x80 sur x86, maintenant il utilise l'instruction
sysenter
spécifique) - le numéro d'appel système
- Comment les arguments de la fonction sont-ils transmis au système
- Tout type d'alignement
- ...
Et cela varie beaucoup d'un système d'exploitation à l'autre.
Notez cependant que dans certains cas, il peut y avoir des "adaptateurs ABI" permettant d'exécuter des binaires de un OS sur un autre OS. Par exemple Wine vous permet d'exécuter des exécutables Windows sur différentes versions Unix, NDISwrapper vous permet d'utiliser des pilotes réseau Windows sous Linux.
"bytecode" fait généralement référence au code exécuté par une machine virtuelle (par exemple pour java ou python). C est compilé en code machine, que le processeur peut exécuter directement. Le langage Machine est spécifique au matériel, ce serait donc le même sous n'importe quel système d'exploitation fonctionnant sur une puce intel (même sous Windows), mais les détails de la façon dont le code machine est enveloppé dans un fichier exécutable, et comment il est intégré avec les appels système et les bibliothèques liées dynamiquement sont différents d'un système à
Donc non, vous ne pouvez pas prendre de code compilé et l'utiliser dans un système d'exploitation différent. (Cependant, il existe des "compilateurs croisés" qui s'exécutent sur un système d'exploitation mais génèrent du code qui s'exécutera sur un autre système d'exploitation).
Il n'y a pas de "code d'octet de base qui provient d'un compilateur". Il n'y a que code machine .
Bien que les mêmes instructions de machine puissent être applicables sous plusieurs systèmes d'exploitation (tant qu'elles sont exécutées sur le même matériel), il y a beaucoup plus à un exécutable hébergé que cela, et comme un exécutable natif compilé et lié Pour Linux a des exigences d'exécution et de bibliothèque très différentes de celles de BSD ou Darwin, vous système.
En revanche, les binaires Windows peuvent parfois être exécutés sous Linux, car Linux fournit à la fois un chargeur de format binaire pour le format PE de Windows, ainsi qu'une implémentation API étendue (Wine). En principe, cette idée peut également être utilisée sur d'autres plates-formes, mais je ne suis pas au courant que quelqu'un ait écrit ceci Pour LinuxDarwin. Si vous avez déjà le code source, et qu'il compile sous Linux, alors vous avez de bonnes chances de le compiler également sous MacOS (modulo UI les composants, bien sûr).
Eh bien, peut-être... mais probablement pas.
Mais si c'est le cas, ce n'est pas "parce que les deux sont UNIX" c'est parce que:
- les ordinateurs Mac utilisent le même processeur de nos jours (c'était très différent dans le passé)
- vous utilisez un programme qui n'a aucune dépendance sur une bibliothèque (très improbable)
- vous utilisez les mêmes bibliothèques d'exécution
- vous utilisez un format loader / binaire compatible avec les deux.