南京大学计算机基础链接器和可执行文件笔记
一.链接器
1.
感觉老师还是讲的很不错的,通俗易懂的讲解一个点c文件,从预处理生成.i文件,编译生成.s的汇编文件,再汇编到.o文件,再链接生成一个可执行文件
预处理主要是插入#include "xx.h"这种的头文件,然后处理一些预编译的命令,然后处理完就清除,然后中间过程略过一波,直接到可重定位目标文件
那步,这里说的符号解析的源头是,之前机器码直接使用物理地址来表示变量和函数的,但是有个问题就是物理地址这东西是不确定的,是需要载入
内存后才知道的,虽然有那种静态载入,但是对内存是一种浪费,而且机器码很难记,所以才出现了汇编语言以祝记符的形式,然后变量和函数都用
符号来表示,定义变量和函数叫做符号定义,调用变量和函数叫符号引用,这样好处就是全都用符号去做,就可以重定位了,不过链接的时候,要做的
就是符号解析了,需要有一个符号表,记录符号和相应的虚拟地址空间的地址,链接时,再把符号全换成对应虚拟空间地址,这里虚拟地址转物理地址就
不用我多bb了吧,2333
2.局部变量这种分配在栈中的,是不能叫符号定义的,同时链接本质,是合并节
然后又讲到了,可执行文件的存储器映射到内存的部分,但是映射的都是虚拟空间地址,因为方便呗,映射关系都在程序头表里面,这里还没讲到很深,估计要等后面了,不过我其实目的也是
为了写一个parser罢了2333,这里的映射到虚拟内存其实是在加载到内存中,才需要去做映射,所以在磁盘中,地址还是从0开始。
参考链接:
https://blog.csdn.net/hunter___/article/details/82963577
二.目标文件
1.两种视图
一个是链接视图,还有一个是可执行视图
链接视图,也就是可重定位文件,既可以链接生成可执行文件,也可以生成共享代码库文件,然后剩下感觉和elf的可执行文件格式在磁盘上
差不多,也是由各种节构成,如data节,text节,bss节等,链接的时候还是需要符号表等信息来重定位比较好,然后就是可执行视图,
这个的话,视图是算在内存中的了,里面全是相应的段,从磁盘映射到内存中的视图。
2.可重定位文件格式
见图就好了。唯一觉得有意思的地方,感觉就是在strtab节,那些把符号抹去的,应该是把这个节去了吧,这里留个坑
3.可重定位文件格式
这是elf32位的文件格式,前16个字节,从名字可以看出是识别文件类型的,魔数也在里面,然后就是机器的架构,程序的入口点,但是因为是可重定位文件,不需要执行,所以这里的入口点,一般
默认都是为0,接下来就是程序头表(关于内存映射部分,在下面再说)的偏移,然后是节头表的偏移,以及他们每个表项所占的内存大小,以及表项的数量,其实还是挺简单的233,把目光移动到
节头表,里面的表项,其实就是每个节的信息,偏移,姓名等,放张图,我贼懒2333,另外可重定位文件是没有程序头表的
4.elf可执行文件
多了一个程序头表,里面存储的是几个节映射成一个段的信息,毕竟可执行文件最终还是要加载到内存中的,可执行入口也添加上去了,不过地址是虚拟内存的地址。
2.程序头表和内存映射
可执行文件的角度就是直接站在内存的装载去考虑了,映射肯定得需要一张表来记录,到底是哪个偏移映射到哪个虚拟地址,这个记录的功能就是由程序头表来做的
里面的每个表项,都记录了一个偏移映射到相应的虚拟地址上,不过这个偏移是直接按几个节组成一个整体作为单位的。