目录
1.动态库是如何被加载的?
2.那么虚拟地址和物理地址是如何映射的呢?
3.那么动态库的地址怎么来?
1.动态库是如何被加载的?
下面这个就是正常的进程是如何从磁盘中读取信息编译的:
而动态库就存储在共享区段:(系统在运行存在多个动态库的时候,操作系统会先描述(创建结构体)再组织的,将这些库管理起来,所以所有库的加载情况,OS会非常的清楚,动态库只会加载一遍到物理内存中)
2.那么虚拟地址和物理地址是如何映射的呢?
首先,得知道上面这个问题,我们才能知道动态的地址是如何映射的!
首先我得明白一个问题:当一个main.c形成可执行文件1.exe的时候,它的每一行代码都是有地址的!
但是记住的是,这些地址都是逻辑地址,这里也相当于虚拟地址(这里先不做解释为什么不区分逻辑地址和虚拟地址)
当这些代码加载到物理内存的时候,自然而然的就将这些虚拟地址和物理地址对映起来了!并且通过cwd和exe找到可执行文件,文件中有一个entry可以告诉进程第一条代码是在虚拟地址的哪里,然后页表产生缺页中断,然后将上面的虚拟地址和物理地址对映起来,程序就可以正常运行了!
3.那么动态库的地址怎么来?
可以看到我在上一张图中写了一个func函数,如果这个是动态库中,那么call0x112233,不就代表着这个动态库中的func函数必须要在虚拟地址的0x112233当中吗?但是仔细想想这很难实现,因为正常加载肯定不止这一个库,那么是如何实现的呢?其实这个0x112233是逻辑地址(偏移量),这就是为什么我上面说1.exe中的逻辑地址和虚拟地址是有区别的,但是先那样理解的原因,因为中间的转换其实有点复杂的。
并且我们观察下面的动态库,我们也能猜到下面这个地址,可能就是起始地址:
那么进程找到动态库的内容就会变得容易的多,我们就可以随意的加载动态库到共享区中了!