动态库是怎么被加载的?

目录

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值