elf加载
ELF(Executable and Linkable Format,可执行与可链接格。
所以我们写代码生成的可执行文件,以及写的动态库都是elf格式的文件。
我们重点要关注的就是红色框框里面的section节。
而节保存的就有我们的代码段和数据段。所以我们链接所做的工作其实就是将,相同属性的代码段数据段合并起来,形成新的elf文件。
所以我们用指令就可以查到我们一个可执行文件有多少个节了。
readelf -s a.out
所以我们的可执行文件里的地址就是从全零到全f的逻辑地址。
而我们的虚拟地址就是逻辑地址,我们所要在cpu上执行的就是虚拟地址,只是在elf文件叫逻辑地址,在cpu上叫做逻辑地址。
这是一个可执行文件的执行的流程图:
当以上执行完pc指针会根据该指令的长度进行相加(其实就是加上偏移量),就有了下一条指令的地址了
我是这样去理解这个虚拟地址的,其实在本没有虚拟地址这个说法的,可执行文件需要在cpu上去跑代码,所以要加载到内存上,内存上保存虚拟地址的东西就是物理内存,而物理内存里面所里面自己本生就是物理地址,只是为了做区分罢了。所以为什么要有虚拟内存呢?就是将两个不同内存
进行解耦,编译器在编译的时候就不用去考虑物理内存了。
还有个问题就是,如果一个很大的文件要被加载怎么办呢?其实就是将已将映射好执行完的虚拟地址进行释放让后重新再来加载后面的,这样就是一个动态的过程。
动态库加载
所以起始我们很多的动态库也是像这样加载的。