【问题标题】:Why there is a stub for MS-DOS in PE files? [closed]为什么 PE 文件中有 MS-DOS 存根? [关闭]
【发布时间】:2011-10-21 17:01:14
【问题描述】:

在最新版本的 PE 文件中,有一个存根向 MS DOS 用户显示句子 This program can not be run in DOS mode。为什么这样的消息仍然存在,尽管它浪费了大约 38 个字节?有没有人还在用MS-DOS?

【问题讨论】:

  • 他们可能的意思是——不要从命令行运行

标签: windows dos stub portable-executable


【解决方案1】:

它仍然存在,因为没有简单的方法可以在不破坏文件格式的情况下删除它,而且似乎没有人认为每个可执行文件 38 字节值得麻烦。无论如何,对部分对齐的要求几乎总是“浪费”很多很多

【讨论】:

    【解决方案2】:

    在某个地方,有人仍在使用 DOS。而且,对于向后兼容性问题,38 个字节仍然需要存在。即使没有人使用DOS。

    您会惊讶地发现 Windows 代码为了保持向后兼容而跳了多少圈。

    【讨论】:

      【解决方案3】:

      当 PE 格式被引入时(1994 年,Windows NT 3.1),DOS 仍然很流行。错误地从 DOS 运行 Windows EXE 的风险是非常真实的。所以他们需要让 Windows EXE 表面上兼容 DOS 加载器。所以在这种情况下,程序会做一些事情(即打印一条消息并退出)而不是随机崩溃。

      显然,以某种方式修改 DOS 加载程序以识别 Windows EXE 不是一种选择。 DOS exe 标头中没有“平台/架构”标识符,就像在 PE 中一样 - 没有内置机制用于将来引入不兼容性。此外,“这是一个 Windows 程序,请在 Windows 下运行”是一个更友好的消息,即“此程序与您的系统不兼容”。

      DOS 存根也是旧的 16 位 Windows EXE 格式的一部分(“NE”代表“新的可执行文件”)。存根的路径甚至是一个可设置的链接器参数,因此可以制作某种“胖二进制” - Windows 位将是您的 Windows 程序,而 DOS 存根将是相同的程序(即相同的功能)对于 DOS。 AFAIK,很少有人利用这一点。

      【讨论】:

      • IIRC Win95 中的磁盘扫描程序是“胖二进制”。
      • reg.exe 也是一个双dos/win32程序。
      • QEMM97 的安装程序也是如此庞大的二进制文件。从 DOS 运行它,您将获得一个仅安装 DOS 位的文本模式安装程序。从 Windows 运行它,你会得到一个安装所有东西的图形安装程序。
      【解决方案4】:

      虽然磁盘操作系统(DOS)这些天没有被使用,但基本上是命令行(或控制台模式)的 DOS 模式仍然存在并且非常流行。 DOS-MODE 可能意味着命令行模式。控制台应用程序非常流行,并且在任何地方都可以使用,尤其是在测试和开发环境中。

      【讨论】:

      • 命令行/控制台应用程序有时被不恰当地称为 DOS 应用程序,但 PE 格式的 DOS 存根确实适用于 MS-DOS。它与控制台应用程序无关。
      猜你喜欢
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 2013-02-12
      • 2012-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多