28 votes

Pourquoi les "fichiers exécutables" dépendent-ils du système d'exploitation ?

Je comprends que chaque CPU/architecture a son propre jeu d'instructions, donc un programme (binaire) écrit pour un CPU spécifique ne peut pas fonctionner sur un autre. Mais ce que je ne comprends pas vraiment, c'est pourquoi un fichier exécutable (binaire comme .exe par exemple) ne peut pas fonctionner sous Linux mais peut fonctionner sous Windows, même sur la même machine.

C'est une question de base, et la réponse que j'attends est que les .exe et autres formats binaires ne sont probablement pas des instructions machine brutes mais qu'ils contiennent des données qui dépendent du système d'exploitation. Si c'est vrai, à quoi ressemblent ces données dépendantes du système d'exploitation ? et, à titre d'exemple, quel est le format d'un fichier .exe et la différence entre celui-ci et les exécutables Linux ?

Existe-t-il une source où je peux obtenir des informations brèves et détaillées à ce sujet ?

15voto

Alexander Gessler Points 26717

Afin de faire quelque chose de significatif, les applications devront s'interfacer avec le système d'exploitation. Puisque les appels système et l'infrastructure de l'espace utilisateur ont l'air fondamentalement sous Windows et Unix/Linux, le fait d'avoir des formats différents pour les programmes exécutables est le plus petit problème. C'est le logique du programme qu'il faudrait modifier.

(Vous pourriez argumenter que cela n'a pas de sens si vous avez un programme qui dépend uniquement de composants standardisés, par exemple la bibliothèque d'exécution C. Cela est théoriquement vrai - mais non pertinent pour la plupart des applications puisqu'elles sont forcées d'utiliser des éléments dépendant du système d'exploitation. C'est théoriquement vrai - mais non pertinent pour la plupart des applications puisqu'elles sont obligées d'utiliser des éléments dépendant du système d'exploitation).

Les autres différences entre Windows PE (EXE, DLL,..) et des fichiers Linux ELF sont liées aux différents chargeurs d'images et à certaines caractéristiques de conception des deux systèmes d'exploitation. Par exemple, sous Linux, un programme distinct est utilisé pour résoudre les importations de bibliothèques externes, alors que cette fonctionnalité est intégrée sous Windows. Autre exemple : Les bibliothèques partagées de Linux fonctionnent différemment des DLL de Windows. Sans oublier que les deux formats sont optimisés pour permettre aux noyaux des systèmes d'exploitation respectifs de charger les programmes aussi rapidement que possible.

Les émulateurs comme Wine tentent de combler ce vide ( et prouvent en fait que le plus gros problème n'est pas le format binaire mais plutôt l'interface du système d'exploitation ! ).

3voto

S.Lott Points 207588

Les fichiers .exe et autres formats binaires ne sont [certainement] pas des instructions machine brutes, mais ils contiennent des données qui dépendent du système d'exploitation.

à quoi ressemblent ces données dépendantes du système d'exploitation ? et, à titre d'exemple, quel est le format d'un fichier .exe et la différence entre celui-ci et les exécutables Linux ?

Eh bien, je suppose que Google vous a complètement déçu. Les formats .EXE sont très bien définis par la documentation de Windows.

http://support.microsoft.com/kb/65122

Le système Linux ld L'application charge un exécutable en mémoire avant de l'"exécuter" vers ce fichier. Vous pouvez vous renseigner sur ld ou encore le célèbre format a.out fichier.

http://linux.die.net/man/1/ld

http://en.wikipedia.org/wiki/A.out

http://en.wikipedia.org/wiki/Executable

3voto

khachik Points 12589

Une réponse très naïve :

  1. Leur structure est différente en raison des différents chargeurs de processus ;
  2. Ils utilisent des fonctionnalités dépendantes du système d'exploitation, comme les syscalls, qui varient d'un système d'exploitation à l'autre.

2voto

Stephen Bailey Points 1180

Je ne peux pas trop commenter sur *nix, mais oui, la partie code du binaire est généralement heureuse de fonctionner sur l'un ou l'autre environnement, mais c'est le système d'exploitation qui impose certaines exigences au binaire. Sous Windows, vous devriez vous renseigner sur En-têtes PE .

La deuxième partie dépend simplement du développeur. Souvent, la partie code fera référence à des bibliothèques spécifiques au système d'exploitation - c'est pourquoi il est possible d'avoir du code C++ portable et non portable avant de le compiler en binaire.

2voto

Ingo Points 21438

En dehors du format de l'exécutable qui doit être reconnu par le chargeur système (c'est-à-dire la partie d'un système d'exploitation qui met l'exécutable en mémoire), le véritable problème est l'interface avec le système d'exploitation. Vous pouvez considérer un système d'exploitation comme une sorte d'API qui fournit des points d'entrée que l'on doit appeler pour faire des choses spécifiques, comme par exemple, écrire un caractère sur la console.

Ces détails sont généralement plus ou moins cachés à l'utilisateur final, de sorte que vous pouvez écrire un caractère à l'écran avec le même code source dans des langages de niveau supérieur. Mais souvent, les choses sont plus différentes, comme par exemple l'environnement de fenêtrage. Tous les langages de haut niveau ne fournissent pas une couche de fenêtrage qui fait abstraction de ces différences.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X