在Linux上使用COFF或在Windows上使用ELF

19

能否在UNIX上运行COFF可执行文件或在Windows上运行ELF可执行文件?以及如何才能在Windows和UNIX上运行任何一种文件类型。我只是好奇。


UNIX应用程序子系统概述:http://technet.microsoft.com/en-us/library/cc771672.aspx#BKMK_PortAppsSUA Microsoft Windows Services for UNIX:http://en.wikipedia.org/wiki/Microsoft_Windows_Services_for_UNIX - abmv
SFA/SUA只能运行为NT编译的PE可执行文件。 - ephemient
4个回答

12
为了恰当地回答您的问题,需要先了解 ELF、COFF 和 PE 是什么。这些二进制格式本质上只是容器,向操作系统提供有关如何执行文件中包含的原始 CPU 指令的指示。它们非常类似于音视频容器,例如 MKV、WMV 和 OGG。对可执行格式的支持要么存在于操作系统中,要么不存在。直到最近,Microsoft Windows 一直没有为 COFF 或 ELF 提供任何支持。但随着 Windows 10 的推出,微软通过将 UserMode-Linux 兼容系统例程嵌入 Windows 内核中,间接地为 ELF 提供了支持。UserMode Linux 内核在 Windows 内核之上运行,并几乎以独立于 MS Windows 的方式运行所有 ELF 二进制格式。
使用UserMode-Linux(子内核)的替代方法是,微软需要以完全兼容的格式重写大多数Linux API,他们的选择解决了另一个兼容性问题:API。 "A"代表应用程序,"I"代表接口,但API作为接口主要只是一组可执行例程和环境假设。文件系统和大多数基本系统例程的访问由Windows内核提供,而其他所有内容都在UserMode Linux内核中提供。这样,Windows不仅可以运行ELF格式的可执行文件,还可以运行已经制作为在Linux API上运行的最流行的ELF可执行文件。
反过来,问题的另一半,在Linux上运行PE(大多数Microsoft Windows可执行文件)也是可能的。有两个运行时包装库可以运行MSIL(虚拟机应用程序)和Win32(普通CPU应用程序)。因为Linux内核可扩展以识别某些字节格式,然后运行适当的包装器程序,实际上内核支持PE和潜在的更多可执行容器格式。因此,Linux可以在mono运行时(.NET/C#应用程序)或WINE运行时(Win32 C/C++)中运行一些PE程序。
要安装UserMode-Linux环境,您可以按照Microsoft的开发网络上提供的说明进行操作。简而言之:
  1. 打开开发人员模式:设置|更新和安全性|针对开发人员|选中开发人员模式单选按钮
  2. 从开始菜单中打开“打开或关闭Windows功能”
  3. 向下滚动并勾选“适用于Linux(Beta)的Windows子系统”功能
  4. 点击确定并重新启动(必须步骤)
  5. 重新启动后,打开PowerShell/命令提示符并运行“Bash”,然后按照简单的提示接受Canonical的许可协议并开始下载Ubuntu映像
  6. 下载完成后,您将能够从开始菜单启动“Bash on Ubuntu on Windows”
请注意,此方法仅适用于Windows 10,并且仍然限于文本模式控制台和Win32 Xorg端口(例如vcXsrv)等图形内容。Cygwin或MSYS2系统无法运行ELF二进制文件,但可以实现将通常为ELF二进制文件的应用程序移植并在Linux系统上运行。

我应该回答另一半的问题。有各种方法可以在Linux上运行PE(Windows可执行文件),因为Linux内核是可扩展的,可以识别特定的字节格式,然后运行适当的包装程序。因此,在mono运行时(.NET / C#应用程序)或WINE运行时(Win32 C / C ++)中,Linux可以运行某些PE程序。 - Micah W

10

要运行可执行文件并使它们发挥作用,你需要关注API而不仅仅是可执行文件格式。在安装了WINE的Linux机器上,可以从命令行运行Windows .EXE文件,并且它们会像在Windows上一样完成相同的任务。

然而,反过来却不太可能。但是,如果在Windows机器上安装CYGWIN,然后使用CYGWIN编译器从源代码重新构建应用程序,则会获得一个可在Windows上运行并在Linux上运行相同任务的可执行文件。许多标准的Linux工具已经移植到CYGWIN存储库中,包括诸如X-Windows和GIMP之类的工具。


正如我在另一个答案中所评论的,http://sf.net/projects/line/ 试图成为 WINE 的反向,可以在 Windows 上运行未修改的 Linux 二进制文件。该项目已经被放弃多年了,但它确实表明这个概念是可行的。如果我记得正确的话,它可以运行一些静态链接的控制台程序,并且 IPC 正在进行中。 - ephemient
现代版本的Windows上有WSL(Windows子系统Linux)。 - bahrep

4

1

COFF最初是由UNIX(大约在System V左右)引入的,因此某些UNIX可能仍支持COFF格式。它已经被Linux弃用了一段时间,很可能大多数其他Unix也已经弃用或直接停止支持。

Windows ELF支持有点棘手-几乎肯定没有不进行一些深层技巧的情况下就能实现。您应该更具体地说明您在这里尝试做什么...


1
http://sf.net/projects/line/ 成功在Windows上加载了ELF可执行文件 -- 这可能是对于有动力的人一个很好的起点。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接