【问题标题】:Native windows Linux本机 windows Linux
【发布时间】:2013-07-20 13:05:20
【问题描述】:

我知道几个在 linux 和 Windows 之间进行交叉编译的项目。

Wine 项目非常适合在 Linux 中运行 Windows 应用程序。

andLinux 是在 Windows 中运行的 linux。

我的问题是,我们是否可以使用 Windows 编译器(如 mingw32、visual studio 等)编译完整的 linux 操作系统,以获得与 Windows PE 可执行格式完全兼容的 linux 系统?

【问题讨论】:

  • mingw32 是一个极简的windows 开发环境,Visual Studio 是一个IDE。它们不是编译器。
  • Linux 原生支持 ELF、a.out 和 COFF 作为目标文件格式。我认为它不支持 PE。
  • @lulyon mingw32 包含一个生成 PE 文件的 GCC 编译器版本。 Microsoft Visual Studio 自带编译器。在这两种情况下,人们通常将两者称为编译器,因为它们都包含编译器。当作为编译器引用时,其中任何一个的含义都不会模棱两可或不清楚。

标签: linux windows mingw portable-executable


【解决方案1】:

正如 wine 所展示的,PE 格式并不是真正的兼容性问题。

PE 只定义程序在加载时如何拼凑在一起。在 Windows 下,RUNDLL 对其进行解释,将所有程序部分加载到内存中,将所有支持的 dll 加载到内存中并修补函数指针,以便内存中的程序可以运行。 (请参阅http://msdn.microsoft.com/en-us/library/ms809762.aspx 了解更多详情。值得一读!

几乎没有什么可以阻止您编写内核模块来完成所有这些工作。有了上面链接页面中的详细信息,这可能并不难,而且可能已经有人这样做了。

真正的问题是操作系统的基础。即使linux可以加载PE,文件名(\或/)的根本差异以及不同的权限模型和linux下不存在的windows注册表也会存在问题。那是在您进入不同的 GUI 窗口模型之前。

因此,让 windows 程序在 linux 下运行的任务与程序加载器无关,更多的是在 Linux 下模拟所有 windows DLL。据我了解,这是葡萄酒的主要心脏。

【讨论】:

  • +1 你把整个问题说得很清楚了。程序加载器,在 Linux 下模拟 Windows DLL,听起来像 Cygwin 做的。
  • 您可以使用bin_fmt 让WINE 运行.exe 文件。如果设置正确,它将透明地加载 win32 可执行文件,这非常酷。
  • @couling,是的。您对 linux 源代码的请求修改是正确的,以便考虑到文件系统、注册表、设备驱动程序等 Windows 的特殊性。但我认为这些修改对于 linux 社区来说并不难实现. “好”的想法是制作一个 100% 与 Windows 兼容的 Linux“克隆”。
  • 用 \\ 替换 / 可以使用 #DEFINE 来完成。 linux /etc 几乎模拟了注册表。没有必要重新设计 linux 来实现它们。正如您所说,需要一组 DLL 来在以 PE 格式编译的 linux 内核之上提供 Windows 兼容层。
猜你喜欢
  • 1970-01-01
  • 2011-12-02
  • 2016-01-10
  • 1970-01-01
  • 2014-11-02
  • 2016-02-02
  • 1970-01-01
  • 2023-03-11
  • 2014-10-07
相关资源
最近更新 更多