Les exécutables Linux et Windows utilisent des formats différents. Linux utilise le format ELF sur la plupart des architectures, tandis que Windows utilise le format PE. ELF est mieux adapté à la façon dont Linux gère les bibliothèques partagées, et PE est mieux adapté à la façon dont Windows gère les bibliothèques partagées, mais il n'y a aucune raison fondamentale pour que Linux ne puisse pas exécuter les exécutables PE ou Windows ELF. En fait Linux peut exécuter des exécutables PE, via Wine.
La difficulté est que Windows et Linux ont des API complètement différentes :ils ont des interfaces de noyau et des ensembles de bibliothèques différents. Donc, pour exécuter réellement une application Windows, Linux aurait besoin d'émuler tous les appels d'API effectués par l'application. C'est beaucoup de travail. Wine le fait dans une certaine mesure, mais c'est très difficile, d'autant plus que le fabricant de Windows ne coopère pas. Vous pouvez le comparer avec, par exemple, l'apprentissage de l'anglais lorsque votre langue maternelle est le chinois :le format exécutable est l'alphabet (pas si difficile à maîtriser), l'API est le vocabulaire (il faut des années pour arriver à un niveau où vous pouvez commencer à lire de la littérature ).
Les binaires Windows ont un ABI différent et utilisent une API différente de celle des binaires Linux.
Les binaires Linux n'ont pas besoin d'extension car *nix utilise des bits d'autorisation pour identifier un exécutable au lieu de l'extension.