windows平台DLL的加载机制

来源:互联网 发布:淘宝怎做直扫付款 编辑:程序博客网 时间:2024/06/05 06:50

    最近一直在配合测试做性能测试,前一段时间谈到了LoadRunner和动态加载(或延时加载)的问题,真的是被windows的延时加载机制搞得有点头大,还好真相总是在我面前无处藏身。下面我抽象了四个问题,依次回答完 这四个问题,相信你对windows的延时加载机制会有一个深入的了解。

    我们现在假设有一个宿主程序A.EXE,它依赖B.DLL,C.DLL和D.DLL,其中C.DLL依赖于B.DLL,而D.DLL又依赖C.DLL。在工程配置中B.dll分别被A.exe和C.dll延时加载,C.dll又被D.dll延时加载,下面就是我提出的四个问题。

    1.依照以上描述,请问程序启动时B.dll会被延时加载还是静态加载?

    2.在之前的配置基础上,在A.exe工程配置中将C.dll改成延时加载,请问程序启动时B.dll会被延时加载还是静态加载?

    3.在2的配置基础上,在A.exe工程配置中将D.dll改成延时加载,请问程序启动时B.dll会被延时加载还是静态加载?

    4.在3的配置基础上,将C.dll再改回静态加载,A.dll又将被如何加载?

    实际上,操作系统加载模块是一个递归的过程。比如A依赖B,B又依赖C和D,C依赖...,D依赖...。那么当A准备加载B时,会先查看B依赖谁?一看B依赖于C和D,则检查C又依赖谁,如此递归,直到叶子节点。现在开始准备加载叶子,在加载叶子之前,先检查叶子是否被加载过了,如果加载过了就不加载,继续下一个模块;如果没有加载,则检查该叶子节点是否需要延时加载,如果是延时加载,则暂不加载,继续一个模块;若无须延时加载,则立即加载该叶子模块。如此递归!

原创粉丝点击