Windows .exe文件可以在Linux上运行吗?
如果使用相同的架构,是否可能?就像两个程序都在X86架构上运行一样,是否可以.exe在Linux上运行Windows ?
Windows .exe文件可以在Linux上运行吗?
如果使用相同的架构,是否可能?就像两个程序都在X86架构上运行一样,是否可以.exe在Linux上运行Windows ?
Answers:
exe文件将在Linux或Windows下执行,但不能同时在两者上执行。
在Windows下执行
如果该文件是Windows文件,它将无法在Linux上单独运行。因此,您可以尝试在Windows兼容层(Wine)下运行它。如果它与wine不兼容,那么您将无法在Linux下执行它。
在开始之前,您需要安装Wine。安装Wine所需的步骤将随所使用的Linux平台而变化。您可能可以使用Google“ Ubuntu install wine”,例如,如果要安装Ubuntu。
一旦您安装了wine,就可以执行这些命令。
wine xxx.exe
在Linux下执行
如果您知道此文件可在linux下运行,则需要执行以下命令:
你要更改权限允许所有用户到E X ecute这个文件(+ X)。你也可以仅允许用户到E X ecute(U + X)
chmod a+x xxx.exe
启动程序,./告诉命令行在当前路径中查找要执行的文件(如果“当前”目录不在$ PATH环境变量中)。
./xxx.exe
操作系统(Windows或Linux)为应用程序提供服务。例如,Windows和Linux将具有应用程序可以调用的功能,以访问文件,访问网络,在屏幕上显示内容等。
不同的操作系统提供不同的方式来执行这些操作,因此,即使CPU架构相同,以Windows方式执行此操作的应用程序也无法在Linux上运行,反之亦然。
不,不同的操作系统使用不同的格式(即Windows使用PE,而Linux使用ELF)。另外,在编译时,您的程序会调用本机OS方法。如前所述,您可以研究使用WINE。它提供了在Linux上运行Windows Binaries的大多数功能。
.exe文件不能直接在Linux上运行以及Linux可执行文件不能直接在Windows上运行的三个主要原因。
首先是系统调用。根据定义,系统调用几乎是特定于平台的。但是,并非所有系统调用都相同。有便携式系统调用(例如,由C / C ++标准库定义)和非便携式系统调用(例如,由POSIX或Microsoft定义)。在编译时与系统库进行静态链接的应用程序会发现,由于平台的设计差异很大,因此静态包含的部分代码可能无法在目标平台中正确执行。在运行时动态链接的应用程序确实有一些条件可以运行:如果是可移植的系统调用,则在原始二进制文件的系统调用与目标平台的系统调用之间有一个转换表;如果是非便携式系统调用,在图1中,不同的平台具有不同的功能集,而某些功能在其他平台中没有意义2)。
解决方案:为了在Linux中运行Windows程序,Wine提供了Windows系统调用和Windows系统库的实现,它还可以识别PE格式。Wine可以在Linux中运行Windows程序,而无需重新编译。对于Windows中的Linux程序,Cygwin在Windows中提供了POSIX系统调用的实现,它允许使用Cygwin GCC重新编译为Linux编写的程序,而无需更改源代码即可在Windows系统上运行。由于大多数Linux程序具有开源特性,因此重新编译比使用Wine提供二进制兼容层的方式更容易。提供像葡萄酒一样的兼容性层不是不可能的,但是Cygwin的方式更加健壮,并且没有太多的驱动程序可以轻松地将非开源Linux程序移植到Windows。
另一种是可执行格式。Windows使用PE(便携式可执行格式)格式,Linux使用ELF(可执行和可链接格式)格式。可执行文件格式包含元数据,并定义平台如何加载和执行可执行文件。
解决方案:完全可以编写一个PE-> ELF或ELF-> PE转换器。并且这样做可能并不难(警告:我对这两种格式的实际格式都不熟悉)。另一种方法是编写一个可以理解PE文件的可执行加载器(例如Wine提供了一个文件)或一个可以理解ELF文件的可执行加载器(我相信Windows的设计限制了双击文件可本地运行为可执行文件的可能性)
系统调用调用约定。Linux和Windows不仅具有不同的可用系统调用集,而且还具有非常不同的系统调用调用约定。在Linux中,要进行系统调用,请在eax / rax寄存器中传递syscall编号,并在其余寄存器中传递参数,然后发出0x80中断请求。在DOS中,您还可以在寄存器中传递参数,但是每个系统服务都有一个不同的中断请求号,因此您不会在eax / rax中传递系统调用号。Windows NT与Linux更相似,但是您引发的是0x2E中断请求,而不是0x80,但是系统调用号仍然不同(因此,您需要系统调用号转换表和兼容性层)。
解决方案:即使您没有自修改代码或试图以代码形式执行数据或执行其他棘手的代码,也仍然很难(就像解决“停止问题”一样)分析可执行文件,搜索所有系统调用中断请求,并将其转换为目标平台的系统调用。一种更简单的方法是提供运行时服务,以处理程序的中断请求,并将其重定向到目标平台的系统调用3。
还有其他各种原因,但我相信这三个是最大的绊脚石。
想到1个文件系统安全性,就无法在Linux的安全性位和Windows的NTFS ACL之间进行转换。
2 Windows无法派生进程;CreateProcess可以在某种程度上用来模拟fork,但是会丢失写时复制语义。在Windows中无法执行写时复制创建过程。
3我相信葡萄酒可以做到这一点
仅当它是.Net .exe文件时。我在VS中制作了一个应用程序,并在Windows下编译,然后在Linux上运行它
mono myapp.exe
我知道这并不是您要找的东西,但是答案是您可以在Linux上运行一些 exe文件。