为了账号安全,请及时绑定邮箱和手机立即绑定

操作系统如何决定如何运行.exe

操作系统如何决定如何运行.exe

C#
牛魔王的故事 2023-08-13 16:03:11
假设我在 Windows 上启动一个 .exe 文件。该文件可以用 C++、Java 或 C# 编写并编译为 .exe。对于C++,操作系统可以直接执行命令。但是 Windows 如何知道它必须启动 Java 或 C# 的运行时(JVM 或 CLR)呢?另外如何决定启动哪个运行时?
查看完整描述

2 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

对于 CLR,您正在查看的信息位于可执行文件的 PE 标头。 

在 .NET 可执行文件中,PE 代码部分包含一个调用 CLR 虚拟机启动条目、mscoree.dll 中的 _CorExeMain 或 _CorDllMain 的存根,与 Visual Basic 可执行文件中的情况非常相似。然后,虚拟机利用存在的 .NET 元数据,其根 IMAGE_COR20_HEADER(也称为“CLR 标头”)由 PE 标头数据目录中的 IMAGE_DIRECTORY_ENTRY_COMHEADER[6] 条目指向。IMAGE_COR20_HEADER 与 PE 的可选标头非常相似,本质上是为 CLR 加载程序发挥其作用。2

与 CLR 相关的数据(包括根结构本身)通常包含在公共代码段 .text 中。它由几个目录组成:元数据、嵌入式资源、强名称和一些用于本机代码互操作性的目录。元数据目录是一组表,列出程序集中所有不同的 .NET 实体,包括类型、方法、字段、常量、事件以及它们之间和对其他程序集的引用。

来自微软:

.cormeta 部分(仅限对象)CLR 元数据存储在此部分中。它用于指示目标文件包含托管代码。元数据的格式没有记录,但可以交给 CLR 接口来处理元数据。

对于 Java,有一个加载器可以加载嵌入到可执行文件中的 JAR(与过去的 DOS 加载器或 EXE 加壳器非常相似)。后一种技术实际上可以应用于任何东西,例如作为资源嵌入在 .EXE 中的 .bat 文件,该文件由某些加载器加载和执行。这不需要 Windows 加载程序的任何帮助。


查看完整回答
反对 回复 2023-08-13
?
哔哔one

TA贡献1854条经验 获得超8个赞

一般来说,Windows只识别PE格式,当pe可执行文件启动时,它的职责就是引导宇宙。

为了演示它, unix/linux世界中有crt0 ,它是开源的,你可以查看crt0是如何工作的。

顺便说一句,除了 之外crt0,还有crt1crticrtn, 在引导或终止的不同阶段运行。


查看完整回答
反对 回复 2023-08-13
  • 2 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信