为什么可执行二进制文件中存在一些错

时间:2012-06-08 16:02:56

标签: windows executable

回答另一个关于const字符串数据如何存储在可执行文件中的问题出现了一个问题:为什么运行时错误消息存储在可执行文件中而不是由OS生成?

!This program cannot be run in DOS mode.
似乎合理,DOS无法检测到更新的Windows应用程序并生成相应的错误消息。当程序处于无法与OS功能可靠通信的状态时,也可能发生其他一些有关堆栈帧损坏的问题

但有些人没有意义:
- Attempt to use MSIL code from this assembly during native code initialization...etc..
如果我试图调用.Net程序集(我没有 - 这是纯C ++代码),那么.Net或OS运行时肯定会设法生成错误消息本身。

文件系统错误消息也在exe中。当然,我希望操作系统在运行时生成这些错误 - 如果应用程序是在非英语版本的Windows上运行,我不希望系统错误反映该语言而不是我用来编译它的语言吗?

只是周五下午的一个问题,但Raymond Chen's site

上似乎没有任何相关信息。

3 个答案:

答案 0 :(得分:1)

我所知道的示例是特定放置的存根,因为OS或某些运行时没有很好的方法来产生错误。此外,它们是实现的基本问题,而不是用户应该看到的错误类型。

DOS一个是一个很好的例子。 DOS无法识别Windows程序并产生合理的错误,因此存根代码包含在Windows程序中。

您的MSIL非常相似。如果没有实际加载运行时,运行时如何产生此错误(因为程序仍在初始化)?

我能想到的另一个例子是C ++程序中的“纯虚函数调用”。抽象基类vtable填充了发出此消息的存根。我认为他们可能是一个操作系统调用来生成相同消息的存根,但这对于从未发生过的事情来说似乎有些过分。

如果您尝试从未实际链接到浮点库的本机C或C ++程序调用浮点库,则会出现类似问题。这本质上是语言运行时库的浮点实现细节(与编译器和链接器合作)。这不是操作系统级别的问题(在某种意义上说,“找不到文件”)。

答案 1 :(得分:0)

这样你就可以全球化你的应用程序。

E.g Ivan可以使用俄语生成错误消息,即使它在法语操作系统上运行。

答案 2 :(得分:0)

我猜这是由CRT引入的代码,尝试编译一个不与default libraries链接的测试应用程序并使用mainCRTstartup作为入口点,那么唯一的字符串应该是错误消息in DOS存根。