动态库加载(可执行程序和地址空间)

首先,不论是可执行程序还是动静态库,本质都是磁盘上的文件。

其次,不管是加载还是运行,第一步都是要先找到文件,所以在运行可执行程序时,前面需要加 ./ ,加载库时,都需要路径来帮助编译器/程序找到那个库。

动态库使用的整体轮廓:
 

动态库在加载之后,要映射到当前进程地址空间上的堆栈之间的共享区。

每多一个进程要用这个动态库的时候,并不需要把这个动态库从磁盘中再加载一份到内存中,这个进程只需要将该动态库与其地址空间中的共享区建立映射关系就好了。

补充:动态库也叫做共享库。

我们的可执行程序,编译成功后,没有加载运行时,它的二进制代码中,也是包含了“地址”的。-- 可用 objdump -S 可执行程序名 命令查看该可执行程序的汇编代码。

补充:我们用语言(C、C++...)编写的程序,它的源代码中的 变量名、函数名 ,在它被翻译成二进制的代码之后,这些 变量名、函数名 就都不在了,变成了“地址”。

补充:我们一般在 Linux 当中形成的可执行程序,它的格式叫做:ELF格式的可执行程序。

二进制是有自己的固定格式的,它一定要有它对应的elf可执行程序的头部,头部有着很多可执行程序的属性。

可执行程序编译之后,会变成很多行的汇编语句,每条汇编语句都有它的地址。

问题:程序未加载时,这些地址是什么地址?编译器又是如何对这些汇编语句进行编址的?

答:首先,编址一定要有编址范围,目前认为我们的编址范围就是:000...000 ~ fff...fff。以 000...000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值