动态库是怎么被加载的?

目录

  1.动态库是如何被加载的?

2.那么虚拟地址和物理地址是如何映射的呢?

3.那么动态库的地址怎么来?


  1.动态库是如何被加载的?

下面这个就是正常的进程是如何从磁盘中读取信息编译的:

动态库是怎么被加载的?_第1张图片

而动态库就存储在共享区段:(系统在运行存在多个动态库的时候,操作系统会先描述(创建结构体)再组织的,将这些库管理起来,所以所有库的加载情况,OS会非常的清楚,动态库只会加载一遍到物理内存中)
动态库是怎么被加载的?_第2张图片

2.那么虚拟地址和物理地址是如何映射的呢?

首先,得知道上面这个问题,我们才能知道动态的地址是如何映射的!

首先我得明白一个问题:当一个main.c形成可执行文件1.exe的时候,它的每一行代码都是有地址的!

动态库是怎么被加载的?_第3张图片

但是记住的是,这些地址都是逻辑地址,这里也相当于虚拟地址(这里先不做解释为什么不区分逻辑地址和虚拟地址)

当这些代码加载到物理内存的时候,自然而然的就将这些虚拟地址和物理地址对映起来了!并且通过cwd和exe找到可执行文件,文件中有一个entry可以告诉进程第一条代码是在虚拟地址的哪里,然后页表产生缺页中断,然后将上面的虚拟地址和物理地址对映起来,程序就可以正常运行了!

动态库是怎么被加载的?_第4张图片

3.那么动态库的地址怎么来?

可以看到我在上一张图中写了一个func函数,如果这个是动态库中,那么call0x112233,不就代表着这个动态库中的func函数必须要在虚拟地址的0x112233当中吗?但是仔细想想这很难实现,因为正常加载肯定不止这一个库,那么是如何实现的呢?其实这个0x112233是逻辑地址(偏移量),这就是为什么我上面说1.exe中的逻辑地址和虚拟地址是有区别的,但是先那样理解的原因,因为中间的转换其实有点复杂的。

并且我们观察下面的动态库,我们也能猜到下面这个地址,可能就是起始地址:

那么进程找到动态库的内容就会变得容易的多,我们就可以随意的加载动态库到共享区中了!

你可能感兴趣的:(linux,服务器)