程序编译-汇编-链接的理解!
写在前面:
对于程序编译汇编链接过程的理解。
涉及到程序的重定位,虚拟内存,静态链接,动态链接的概念的理解。
早期程序员采用的是机器语言的编写程序。非常的麻烦。
后来采用汇编语言编写,将一些操作采用符号的方式,用符号的方式表示一些操作和跳转的位置。
无需在写程序的时候知道具体要跳转的位置,用符号表示就可以。
在链接时在对应的符号的引用处填入定义的地址!!
确定符号引用关系也就是符号的解析!
多个程序链接的时候,将代码合并,将数据合并,这些合并是分开的,最终得到的是一个合并的新的程序,将这个程序存放在虚拟地址空间。
重定位就是:确定每个符号的新地址(虚拟地址),并且在指令当中填入对应的地址。
链接的本质:
这里描述的非常到位:链接的本质就是合并相同的“节”。
将可重定位的目标文件中的代码节合并,数据节合并,形成可执行文件。
对于Linux里的ELF文件:所有的可执行文件的数据代码都是从0x08048000这个虚拟地址开始的!
对于32位的计算机,其虚拟地址大小为2的32次方为4GB。
虚拟地址是从高往低扩展的。
最上面存放的是内核的代码。
接下来是用户栈的数据,从上往下动态生成。
然后是共享库区域。
从0x08048000这个虚拟地址往上是可执行代码的只读代码段
再往上是读写代码段
再往上是堆
Linux汇编 链接 可执行生成的过程!
Linux 默认生成的可执行文件的文件名为 a.out
目标文件的格式:
目标代码:指编译器和汇编器处理源代码之后所生成的机器语言目标代码(二进制指令01序列)。
目标文件:包含目标代码的文件。
executable and linkable format可执行和可连接。
链接视图:
可链接文件生成可执行文件或者共享目标文件。
静态链接库文件由若干个可重定位的目标文件组成。
代码节.text
已初始化的全局变量和局部静态变量.data
未初始化的全局变量和局部静态变量.bss
包含一些重定位信息 指出哪些符号引用需要重定位
文件扩展名为.o windows里为.obj
节构成。节是ELF文件中具有相同特征的最小可处理单位
执行视图:
由若干个段构成
每个段由软干个节构成
程序头表 描述这些节如何映射到存储段当中去。