zoukankan      html  css  js  c++  java
  • CLR寄宿(中) 托管exe文件的加载和执行

    CLR寄宿()  托管exe文件的加载和执行

    托管exe文件加载和执行过程在之前的文章做过简要介绍,现在结合本章内容进行详细分析。

    托管exe文件被启动时候,首先被PE Loader载入。PE Loader载入exe文件之后,会分析PE文件头data directory table,如果CLR_Header值不为0,表示该文件是托管PE文件,PE Loader 会立即载入 MsCorEE.dll,并且执行 MsCorEE.dll_CorExeMain()函数。

    如果是Windows XP以前版本操作系统(比如Windows 2000),当Windows 2000 Loader exe文件载入之后,会检查PE Header data directory table,将Import Table 所记录数据都载入内存,就是MsCorEE.dll。接着找出 PE header 内程序入口点,并执行此处代码。这是 x86 机器码,由编译器自动产生,只有一道指令 (6 bytes),为“FF 25 00 20 40 00,翻译成 x86汇编语言就是“JMP DWORD PTR [402000]”,其中 0x00400000 exe文件 image base,而 0x2000 import address table RVA (此处是_CorExeMain() 偏移地址),所以执行“JMP DWORD PTR [402000]结果会跳到 MsCorEE.dll _CorExeMain()

    在执行_CorExeMain()之后,其中代码首先判断需要载入CLR版本。

    CLR启动之后,接下来要做就是初始化工作,为托管程序建立进程,申请内存空间,建立线程池和应用程序域。第一个建立应用程序域被称为Default AppDomain

    初始化之后,要载入MsCorLib.dll组件和其中模块。

    模块载入之后,会调用class loader 来载入 MsCorLib 内相关 class载入 class 顺序依次为:

    1)        System.Object

    2)        System.ICloneable

    3)        System.Collections.IEnumerable

    4)        ……

    5)        System.AppDomain

    6)        System.LoaderOptimization

    7)        System.Runtime.Remoting.Proxies.__TransparentProxy

    注意 此时并未载入 MsCorLib 内全部 class,只载入目前需要 class

    载入class之后,CLR会生成主线程,生成主线程又需要载入以下类:

    System.Threading.Monitor

    System.IAppDomainSetup

    System.AppDomainSetup

    System.Char

    System.Runtime.InteropServices.RuntimeEnvironment

    System.RuntimeFieldHandle

    System.Runtime.CompilerServices.RuntimeHelpers

    System.Environment

    主线程生成之后就是载入应用程序组件到应用程序域,之后才真正进入应用程序主函数。

    进入Main()函数之后,会调用JIT编译器将IL代码编译成本地代码执行。 


    作者:玄魂
    出处:http://www.cnblogs.com/xuanhun/
    原文链接:http://www.cnblogs.com/xuanhun/ 更多内容,请访问我的个人站点 对编程,安全感兴趣的,加qq群:hacking-1群:303242737,hacking-2群:147098303,nw.js,electron交流群 313717550。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    关注我:关注玄魂的微信公众号

  • 相关阅读:
    增量更新代码步骤记录
    软件缺陷管理基本流程
    数据库语言(三):MySQL、PostgreSQL、JDBC
    eclipse的使用
    数据库语言(二):SQL语法实例整理
    windows下MySql没有setup.exe时的安装方法
    数学:完全独立于实际场景的情况下定义的概念,可以正确的描述世界
    数学语言和程序语言的对比:面向过程与面向集合&命题
    iOS开发之IMP和SEL(方法和类的反射)
    iOS之UIButton的normal和selected状态切换
  • 原文地址:https://www.cnblogs.com/xuanhun/p/2559351.html
Copyright © 2011-2022 走看看