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 加载程序的任何帮助。
TA贡献1854条经验 获得超8个赞
一般来说,Windows只识别PE格式,当pe可执行文件启动时,它的职责就是引导宇宙。
为了演示它, unix/linux世界中有crt0 ,它是开源的,你可以查看crt0是如何工作的。
顺便说一句,除了 之外crt0
,还有crt1
, crti
, crtn
, 在引导或终止的不同阶段运行。
- 2 回答
- 0 关注
- 94 浏览
添加回答
举报