猿问

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

假设我在 Windows 上启动一个 .exe 文件。该文件可以用 C++、Java 或 C# 编写并编译为 .exe。

对于C++,操作系统可以直接执行命令。但是 Windows 如何知道它必须启动 Java 或 C# 的运行时(JVM 或 CLR)呢?另外如何决定启动哪个运行时?


牛魔王的故事
浏览 95回答 2
2回答

神不在的星期二

对于 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 加载程序的任何帮助。

哔哔one

一般来说,Windows只识别PE格式,当pe可执行文件启动时,它的职责就是引导宇宙。为了演示它, unix/linux世界中有crt0 ,它是开源的,你可以查看crt0是如何工作的。顺便说一句,除了 之外crt0,还有crt1, crti, crtn, 在引导或终止的不同阶段运行。
随时随地看视频慕课网APP
我要回答