¿Por qué el trabajo de Windows Exe no funciona en Linux?

29

Estoy no preguntar sobre cómo hacer funcionar un exe de Windows en Linux.

Estoy preguntando POR QUÉ no funciona.

¿Qué tiene de diferente la forma en que Windows ejecuta un ejecutable y Linux ejecuta un ejecutable? ¿Por qué tenían que ser diferentes? Además, ¿por qué los ejecutables de Linux no tienen una extensión de archivo?

Nav
fuente
1
Pregunta similar sobre informática : ¿por qué no puedo ejecutar un programa mac de forma nativa en Windows?
Gilles 'SO- deja de ser malvado'

Respuestas:

45

Los ejecutables de Linux y Windows usan diferentes formatos. Linux usa el formato ELF en la mayoría de las arquitecturas, mientras que Windows usa el formato PE . ELF se adapta mejor a la forma en que Linux administra las bibliotecas compartidas, y PE se adapta mejor a la forma en que Windows administra las bibliotecas compartidas, pero no hay una razón fundamental por la que Linux no pueda ejecutar ejecutables PE o ejecutables ELF de Windows. De hecho, Linux puede ejecutar ejecutables de PE, a través de Wine .

La dificultad es que Windows y Linux tienen API completamente diferentes : tienen diferentes interfaces de kernel y conjuntos de bibliotecas. Entonces, para ejecutar realmente una aplicación de Windows, Linux necesitaría emular todas las llamadas a la API que realiza la aplicación. Eso es mucho trabajo. Wine lo hace hasta cierto punto, pero es muy difícil, especialmente porque el fabricante de Windows no coopera. Puede compararlo con, digamos, aprender inglés cuando su lengua materna es el chino: el formato ejecutable es el alfabeto (no es tan difícil de dominar), la API es el vocabulario (lleva años llegar a un nivel en el que pueda comenzar a leer literatura) )

Gilles 'SO- deja de ser malvado'
fuente
99
El "vocabulario" es una excelente analogía.
Pausado hasta nuevo aviso.
Creo que quisiste decir completamente diferente .
Mircea Chirea
Android también admite Linux bnaries (no paquetes) si se compilan para ARM porque está basado en Linux
Suici Doga
@SuiciDoga Más o menos, pero es más complicado que eso. El kernel de Android puede ejecutar binarios de Linux (si están compilados para el ABI del kernel correcto, p. Ej., Mediante el uso de registros NEON), pero si desea ejecutar programas vinculados dinámicamente, también debe instalar todas las bibliotecas. (Y si lo hace, también podría instalar un administrador de paquetes, por lo que "binarios pero no paquete" no es realmente cierto.)
Gilles 'SO- deja de ser malvado'
Sí, sé que tienes que cambiar la ruta de la biblioteca, etc.
Suici Doga
14

Los binarios de Windows tienen una ABI diferente y usan una API diferente que los binarios de Linux.

Los binarios de Linux no necesitan una extensión porque * nix usa bits de permiso para identificar un ejecutable en lugar de la extensión.

Ignacio Vazquez-Abrams
fuente
1
De acuerdo con la respuesta ... datos adicionales que pueden ser relevantes: ELF ( en.wikipedia.org/wiki/Executable_and_Linkable_Format ) vs PE ( en.wikipedia.org/wiki/PE_executable )
RobotHumans
Ah sí, también necesita un cargador diferente. en.wikipedia.org/wiki/Loader_%28computing%29
Ignacio Vazquez-Abrams
Me gusta especialmente la segunda información que falta en la respuesta de @Gilles.
Timothy Gu
@ IgnacioVazquez-Abrams Eso es muy interesante. ¿Qué sucede si te digo que acabo de ejecutar un juego de Windows PlantsVsZombies.exe en Ubuntu 16.04 Linux de forma nativa? Lo hice por aburrimiento sabiendo que no se lanzaría, pero lo hizo y pude jugarlo perfectamente bien. Eso es como imposible, porque ese juego necesita la API de Steam para ejecutarse primero y claramente no. ¿Cómo se lanzó? ¿Debo hacer una nueva pregunta para eso?
Nikos
@ RestlessC0bra: Wine y Mono son cosas.
Ignacio Vazquez-Abrams
0

Así es como escuché el lado de Windows explicado en términos simples por parte de los programadores.

En Windows hay ganchos en los programas y el sistema operativo al que Exe realiza llamadas que simplemente no estarán allí en Linux. Debido a las diferencias en ambos ambientes. Inicialmente, Linux busca permisos, Windows busca primero un formato enlazable examinando la extensión, buscando propiedades y luego buscando dentro del archivo Exe, etc.

Hay aplicaciones como Netbackup que comenzaron en Linux y se han modificado para ejecutarse en un entorno Windows sin usar Wine IMHO, con frecuencia esas son algunas de las aplicaciones de Windows más estables y de mejor comportamiento.

Cuando las aplicaciones de Windows. Por lo general, se vuelven rebeldes porque algunos de los ganchos que tiene la aplicación no se liberaron por completo y Windows cree que sí (fuga de memoria). Cuando Windows entrega ese espacio de memoria inédito a otra aplicación, se bloquea y se quema.

Cuenta
fuente
2
De alguna manera me gustaría creer que Bill Gates respondió mi pregunta ;-)
Nav