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
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.
fuente
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.
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.
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)
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
fuente
Es posible buscar vino
fuente
Solo si es un archivo .Net .exe. Hice una aplicación en VS y la compilé en Windows, luego la ejecuté en Linux
Sé que esto no es exactamente lo que está buscando, pero la respuesta es que puede ejecutar algunos archivos exe en Linux.
fuente
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.
fuente