Le fichier exe s'exécutera sous Linux ou Windows, mais pas les deux.
Exécute sous Windows
Si le fichier est un fichier Windows, il ne fonctionnera pas sous Linux seul. Donc, si c'est le cas, vous pouvez essayer de l'exécuter sous une couche de compatibilité Windows (Wine). S'il n'est pas compatible avec wine, vous ne pourrez pas l'exécuter sous Linux.
Avant de commencer, vous devez installer Wine. Les étapes à suivre pour installer Wine varient selon la plateforme Linux sur laquelle vous vous trouvez. Vous pouvez probablement Google "Ubuntu install wine", si par exemple, vous installez Ubuntu.
Une fois Wine installé, vous pourrez exécuter ces commandes.
wine xxx.exe
Exécuter sous Linux
Si vous savez que ce fichier s'exécute sous linux, alors vous voudrez exécuter ces commandes:
Vous souhaitez modifier les autorisations pour permettre à tous les utilisateurs de e x ecute ce fichier (a + x). vous pouvez également autoriser uniquement l'utilisateur à exécuter e x (u + x)
chmod a+x xxx.exe
Lancez le programme, le ./
dit à la ligne de commande de chercher dans le chemin courant le fichier à exécuter (si le répertoire 'courant' n'est pas dans la variable d'environnement $ PATH.
./xxx.exe
Non, différents systèmes d'exploitation utilisent des formats différents (c.-à-d. Windows utilise PE tandis que linux utilise ELF). De plus, une fois compilé, votre programme appelle des méthodes natives du système d'exploitation. Comme mentionné, vous pouvez envisager d'utiliser WINE . Il fournit la plupart des fonctionnalités pour exécuter des binries Windows sous Linux.
la source
Il existe trois raisons principales pour lesquelles les fichiers .exe ne s'exécutent pas directement sous Linux et pourquoi un exécutable Linux ne s'exécute pas directement sous Windows.
Le premier est les appels système. Les appels système sont, presque par définition, spécifiques à la plate-forme. Cependant, tous les appels système ne sont pas identiques. Il existe des appels système portables (par exemple définis par la bibliothèque standard C / C ++) et des appels système non portables (par exemple définis par POSIX ou Microsoft). Les applications qui sont liées statiquement au moment de la compilation avec les bibliothèques système trouveraient que la partie du code qui est inclus statiquement n'aurait probablement aucune chance de s'exécuter correctement dans la plate-forme cible en raison de la conception très différente de la plate-forme. Les applications qui sont liées dynamiquement au moment de l'exécution ont une chance de fonctionner avec quelques conditions: s'il s'agit d'appels système portables, il existe une table de traduction entre les appels système des binaires d'origine aux appels système de la plate-forme cible; s'il s'agit d'un appel système non portable,1 , différentes plates-formes ont un ensemble de fonctionnalités différent, et certaines fonctionnalités n'ont pas de sens dans l'autre plate-forme 2 ).
Solution: Pour exécuter le programme Windows sous Linux, Wine fournit une implémentation des appels système Windows et des bibliothèques système Windows, il reconnaît également le format PE; Wine peut exécuter le programme Windows sous Linux sans recompilation. Pour le programme Linux sous Windows, Cygwin fournit une implémentation des appels système POSIX sous Windows et permet au programme écrit pour Linux d'être recompilé à l'aide de Cygwin GCC de s'exécuter sur le système Windows sans modification du code source. En raison de la nature open source de la plupart des programmes Linux, il est plus facile de recompiler que d'aller dans le sens de Wine pour fournir une couche compatible binaire. Il n'est pas impossible de fournir une couche de compatibilité similaire à Wine, mais la méthode de Cygwin est plus robuste et il n'y a tout simplement pas beaucoup de lecteur pour permettre au programme Linux non open source d'être facilement porté sur Windows.
L'autre est le format exécutable. Windows utilise le format PE (Portable Executable) et Linux utilise ELF (Executable and Linkable Format). Le format exécutable contient des métadonnées et définit la manière dont l'exécutable doit être chargé et exécuté par la plateforme.
Solution: Il est tout à fait possible d'écrire un convertisseur PE -> ELF ou ELF -> PE; et cela ne devrait probablement pas être trop difficile à faire (avertissement: je ne connais pas le format réel de l'un ou l'autre). Une autre façon est d'écrire un chargeur exécutable qui peut comprendre les fichiers PE (par exemple Wine en fournit un) ou un chargeur exécutable qui peut comprendre le fichier ELF (je pense que la conception de Windows limite la possibilité qu'un fichier double-cliquable s'exécute nativement en tant qu'exécutable)
Appels système convention d'appel. Linux et Windows ont non seulement un ensemble différent d'appels système disponibles, mais également une convention d'appel système très différente. Sous Linux, pour passer un appel système, vous passez le numéro d'appel système dans le registre eax / rax et les arguments dans le reste des registres, puis vous faites une demande d'interruption 0x80. Sous DOS, vous passez également des arguments dans le registre, mais il existe un numéro de demande d'interruption différent pour chaque service système, donc vous ne transmettez pas le numéro d'appel système dans eax / rax. Windows NT est plus similaire à Linux, mais au lieu de 0x80, vous lancez une demande d'interruption 0x2E, cependant le numéro d'appel système diffère toujours (vous avez donc besoin d'une table de traduction de numéro syscall et éventuellement d'une couche de compatibilité).
Solution: même si vous n'avez pas de code auto-modifiable ou si vous essayez d'exécuter des données sous forme de code ou d'autres codes délicats, il est toujours très difficile (aussi difficile que de résoudre le problème de l'arrêt) d'analyser un exécutable, de rechercher tous les systèmes Les appels interrompent les demandes et les traduisent en appels système de la plate-forme cible. Un moyen plus simple consiste à fournir un service d'exécution qui gère les demandes d'interruption du programme et les redirige vers les appels système de la plate-forme cible 3 .
Il y a plusieurs autres raisons, mais je crois que ces trois sont les gros obstacles.
1 la sécurité du système de fichiers vient à l'esprit, il n'y a aucun moyen de traduire entre les bits de sécurité de Linux et l'ACL NTFS de Windows.
2 Windows ne peut pas bifurquer un processus; CreateProcess peut quelque peu être utilisé pour émuler fork, mais il perd la sémantique de copie sur écriture. Il n'y a aucun moyen de créer un processus de copie sur écriture dans Windows.
3 Je crois que Wine fait ça
la source
Il est possible de chercher du vin
la source
Uniquement s'il s'agit d'un fichier .Net .exe. J'ai fait une application en VS et compilée sous Windows puis je l'exécute sous Linux
Je sais que ce n'est pas exactement ce que vous recherchez, mais la réponse est que vous pouvez exécuter des fichiers exe sur Linux.
la source
La seule façon d'exécuter des exécutables sur Win, Linux (ou même Mac) est d'avoir une sorte de "couche virtuelle" entre les directives assembleur et OS, l'option de lukas de l'exécuter sous Mono est une solution, tout comme la construction d'un Java (ou même un Adobe Air).
Il n'est pas possible de créer des binaires qui s'exécutent en l'état sur plusieurs architectures car le code machine est fortement lié au système d'exploitation et même au matériel, vous devrez peut-être effectuer plusieurs versions pour chaque système / système d'exploitation.
la source