¿Puedo ejecutar un archivo .exe de Windows en Linux? [duplicar]

12

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

¿Se .exepuede ejecutar un archivo de Windows en Linux?

Si se usa la misma arquitectura, ¿será posible? Al igual que si ambos programas se ejecutan en la arquitectura X86, ¿será posible ejecutar un Windows .exeen Linux?

Varun Janga
fuente

Respuestas:

13

El archivo exe se ejecutará bajo Linux o Windows, pero no ambos.

Se ejecuta bajo Windows

Si el archivo es un archivo de Windows, no se ejecutará bajo Linux por sí solo. Entonces, si ese es el caso, puede intentar ejecutarlo bajo una capa de compatibilidad de Windows (Wine). Si no es compatible con wine, entonces no podrá ejecutarlo bajo Linux.

Antes de comenzar, necesitará instalar Wine. Los pasos que necesita para instalar Wine variarán con la plataforma Linux en la que se encuentre. Probablemente pueda buscar en Google "Ubuntu install wine", si, por ejemplo, está instalando Ubuntu.

Una vez que haya instalado wine, podrá ejecutar estos comandos.

wine xxx.exe

Ejecutar bajo Linux

Si sabe que este archivo se ejecuta en Linux, querrá ejecutar estos comandos:

Usted querrá cambiar los permisos para permitir que todos los usuarios e x ecute éste (a + x). también podría permitir que solo el usuario e x ecute (u + x)

chmod a+x xxx.exe

Inicie el programa, ./le indica a la línea de comando que busque en la ruta actual para que el archivo se ejecute (si el directorio 'actual' no está en la variable de entorno $ PATH.

./xxx.exe
Thariama
fuente
11

El sistema operativo (Windows o Linux) proporciona servicios a las aplicaciones. Por ejemplo, Windows y Linux tendrán funciones que la aplicación puede llamar para acceder a los archivos, acceder a la red, mostrar cosas en la pantalla, etc.

Los diferentes sistemas operativos proporcionan diferentes formas de hacer esas cosas, por lo que una aplicación que lo hace a la manera de Windows no funcionará en Linux, y viceversa, a pesar de que la arquitectura de la CPU es la misma.

Angus
fuente
2
Esta respuesta es correcta. No es la única razón (los diferentes cargadores y formatos ejecutables también son clave), pero es uno de ellos.
Matthew Flaschen
2
Es una de las principales razones por las que no puede ejecutar el mismo ejecutable de forma nativa en diferentes sistemas operativos.
1
@Let_Me_Be: En realidad, tu comentario no es correcto.
0xA3
1
@ 0xA3 Si está accediendo a una API específica de la plataforma, entonces sí. Pero en su mayor parte, eso en realidad no es cierto. Reimplementar la biblioteca estándar C o C ++ es realmente muy simple, solo necesita volver a implementar los errores y redirigir las llamadas. Lo que requiere mucho trabajo es un formato de archivo diferente (y API específicas de la plataforma, ya que deben volver a implementarse desde cero).
Let_Me_Be
2
@ Vamos, nunca dije que debías. Estaba señalando que usted dijo "en su mayor parte", los programas no usan API específicas de la plataforma; de hecho, la mayoría lo hace . Incluso los programas que usan bibliotecas multiplataforma como GTK todavía usan indirectamente API específicas de la plataforma.
Matthew Flaschen
8

No, diferentes sistemas operativos usan diferentes formatos (es decir, Windows usa PE mientras que Linux usa ELF). Además, cuando se compila, su programa realiza llamadas a métodos nativos del sistema operativo. Como se mencionó, puede considerar el uso de WINE . Proporciona la mayor funcionalidad para ejecutar binries de Windows en Linux.

Nico Huysamen
fuente
5

Hay tres razones principales por las que los archivos .exe no se ejecutarán directamente en Linux y por qué un ejecutable de Linux no se ejecutará directamente en Windows.

  1. El primero son las llamadas al sistema. Las llamadas al sistema son, casi por definición, específicas de la plataforma. Sin embargo, no todas las llamadas al sistema se hacen igual. Hay llamadas de sistema portátiles (por ejemplo, definidas por la biblioteca estándar C / C ++) y llamadas de sistema no portátiles (por ejemplo, definidas por POSIX o Microsoft). Las aplicaciones que están vinculadas estáticamente en tiempo de compilación con las bibliotecas del sistema encontrarían que la parte del código que está incluida estáticamente probablemente no tendría posibilidad de ejecutarse correctamente en la plataforma de destino debido al diseño muy diferente de la plataforma. Las aplicaciones que están dinámicamente vinculadas en tiempo de ejecución tienen la posibilidad de ejecutarse con algunas condiciones: si se trata de llamadas de sistema portátiles, hay una tabla de traducción entre las llamadas del sistema de los binarios originales a las llamadas del sistema de la plataforma de destino; si es una llamada al sistema no portátil,1 , diferentes plataformas tienen un conjunto diferente de características, y algunas características no tienen sentido en la otra plataforma 2 ).

    Solución: para ejecutar el programa de Windows en Linux, Wine proporciona una implementación de las llamadas al sistema de Windows y las bibliotecas del sistema de Windows, también reconoce el formato PE; Wine puede ejecutar el programa de Windows en Linux sin recompilar. Para el programa Linux en Windows, Cygwin proporciona una implementación de las llamadas al sistema POSIX en Windows, y permite que el programa escrito para Linux se vuelva a compilar utilizando Cygwin GCC para ejecutarse en el sistema Windows sin cambios en el código fuente. Debido a la naturaleza de código abierto de la mayoría de los programas de Linux, es más fácil volver a compilar en lugar de seguir el camino de Wine de proporcionar una capa compatible con binarios. No es imposible proporcionar una capa de compatibilidad similar a la del vino, sin embargo, el camino de Cygwin es más robusto y simplemente no hay mucho impulso para permitir que el programa Linux de código abierto se pueda portar fácilmente a Windows.

  2. El otro es el formato ejecutable. Windows usa el formato PE (Portable Ejecutable) y Linux usa ELF (Formato ejecutable y enlazable). El formato ejecutable contiene metadatos y define cómo la plataforma debe cargar y ejecutar el ejecutable.

    Solución: es posible escribir un convertidor PE -> ELF o ELF -> PE; y probablemente no debería ser demasiado difícil hacerlo (advertencia: no estoy familiarizado con el formato real de ninguno de los dos). Otra forma es escribir un cargador ejecutable que pueda comprender archivos PE (por ejemplo, Wine proporciona uno) o un cargador ejecutable que pueda entender un archivo ELF (creo que el diseño de Windows limita la posibilidad de que un archivo de doble clic se ejecute de forma nativa como un ejecutable)

  3. El sistema llama a la convención de llamadas. Linux y Windows no solo tienen un conjunto diferente de llamadas al sistema disponibles, sino que también tienen una convención de llamadas al sistema muy diferente. En Linux, para realizar una llamada al sistema, pasa el número de syscall en el registro eax / rax y los argumentos en el resto de registros, y luego realiza una solicitud de interrupción 0x80. En DOS, también pasa argumentos en el registro, sin embargo, hay un número de solicitud de interrupción diferente para cada servicio del sistema, por lo que no pasa el número de llamada del sistema en eax / rax. Windows NT es más similar a Linux, sin embargo, en lugar de 0x80, genera una solicitud de interrupción de 0x2E, sin embargo, el número de llamada del sistema sigue siendo diferente (por lo que necesita una tabla de traducción de números de llamada al sistema y posiblemente una capa de compatibilidad).

    Solución: incluso cuando no tiene un código auto modificable o intenta ejecutar datos como código o hace otros códigos complicados, aún es muy difícil (tan difícil como resolver el problema de detención) analizar un ejecutable, buscar todo el sistema llama a las solicitudes de interrupción y las traduce a las llamadas del sistema de la plataforma de destino. Una forma más fácil es proporcionar un servicio de tiempo de ejecución que maneje las solicitudes de interrupciones del programa y las redirija a las llamadas del sistema de la plataforma de destino 3 .

Hay varias otras razones, pero creo que estos tres son los grandes escollos.

1 me viene a la mente la seguridad del sistema de archivos, no hay forma de traducir entre los bits de seguridad de Linux y la ACL NTFS de Windows.

2 Windows no puede bifurcar un proceso; CreateProcess se puede utilizar para emular fork, pero pierde la semántica de copiar en escritura. No hay forma de hacer un proceso de creación de copia en escritura en Windows.

3 Creo que Wine hace esto

Lie Ryan
fuente
1

Es posible buscar vino

Paul Whelan
fuente
paul @ no quiero vino ... estoy hablando de programación ... después de obtener un ejecutable después de la compilación. ¿Puede ese ejecutable ejecutarse tanto en Windows como en Linux
1
El artículo de Wikipedia ofrece detalles de alto nivel de por qué se requiere WINE.
Paul Whelan
1

Solo si es un archivo .Net .exe. Hice una aplicación en VS y la compilé en Windows, luego la ejecuté en Linux

mono myapp.exe

Sé que esto no es exactamente lo que está buscando, pero la respuesta es que puede ejecutar algunos archivos exe en Linux.

Lukasz Madon
fuente
1

La única forma de ejecutar ejecutables en Win, Linux (o incluso Mac) es tener algún tipo de "capa virtual" entre el ensamblado y las directivas del sistema operativo, la opción de lukas de ejecutarlo en Mono es una forma de hacerlo, al igual que construir un Java archivo (o incluso un Adobe Air).

No es posible crear archivos binarios que funcionen, como están, para ejecutarse en varias arquitecturas porque el código de máquina está muy vinculado al SO e incluso al hardware, puede que tenga que realizar varias compilaciones para cada sistema / SO.

t3mujin
fuente