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

时间:2019-08-07 09:17:45

标签: java c# c++ windows operating-system

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

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

2 个答案:

答案 0 :(得分:2)

对于CLR,您要查找的信息位于可执行文件的PE标头中。 Wiki和Microsoft Spec。 在CLR的部分列表中有一个部分。

  

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

     

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

并且来自Microsoft:

  

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

对于Java,有一个加载器可以将嵌入的JAR加载到可执行文件中(与DOS加载器或EXE压缩器的旧时代非常相似)。后一种技术实际上可以应用于任何事物,例如作为资源嵌入在.EXE内的.bat文件,由某些加载程序加载并执行。不需要Windows加载程序的任何帮助。

答案 1 :(得分:2)

通常,Windows仅识别PE格式,当pe可执行文件启动时,它有责任引导宇宙。

为了演示它,在开源的unix / linux世界中有crt0,您可以检查crt0的工作方式。

顺便说一句,在crt0旁,还有crt1crticrtn,它们在引导或终止的不同阶段运行。

相关问题