【发布时间】: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
在最新版本的 PE 文件中,有一个存根向 MS DOS 用户显示句子 This program can not be run in DOS mode。为什么这样的消息仍然存在,尽管它浪费了大约 38 个字节?有没有人还在用MS-DOS?
【问题讨论】:
标签: windows dos stub portable-executable
它仍然存在,因为没有简单的方法可以在不破坏文件格式的情况下删除它,而且似乎没有人认为每个可执行文件 38 字节值得麻烦。无论如何,对部分对齐的要求几乎总是“浪费”很多很多。
【讨论】:
在某个地方,有人仍在使用 DOS。而且,对于向后兼容性问题,38 个字节仍然需要存在。即使没有人使用DOS。
您会惊讶地发现 Windows 代码为了保持向后兼容而跳了多少圈。
【讨论】:
当 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,很少有人利用这一点。
【讨论】:
虽然磁盘操作系统(DOS)这些天没有被使用,但基本上是命令行(或控制台模式)的 DOS 模式仍然存在并且非常流行。 DOS-MODE 可能意味着命令行模式。控制台应用程序非常流行,并且在任何地方都可以使用,尤其是在测试和开发环境中。
【讨论】: