假设我在Windows上启动一个.exe文件。该文件可以用C ++或Java或C#编写,然后编译为.exe。
对于C ++,操作系统可以直接执行命令。但是Windows如何知道它必须启动Java或C#的运行时(JVM或CLR)?另外,如何确定启动哪个运行系统?
答案 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
旁,还有crt1
,crti
,crtn
,它们在引导或终止的不同阶段运行。