读《程序员的自我修养》有感---编译&静态链接
2017-09-09 00:00
225 查看
编译型的语言程序,需要经过大体的编译、链接、装载三个步骤,也就是源代码->机器指令(文件),单独的指令文件(带有符号引用)->整体的指令文件(符号已解析),指令文件->实例进程三个过程,这是概略的说。下图可以给出一个稍微具体的过程概览
在汇编之后,得到一个目标文件(obj,.o格式),大体如图所示
由于每个编译得到的目标文件都或多或少地有引用到外部文件符号(变量/函数等),所以在目标文件中此时符号的地址还是待定状态(由0x00000000或者其他立即数代替),而静态链接就是将各个目标文件整合并确定各个待定符号的具体地址,从而成为可执行文件。具体分为两个关键步骤:
空间与地址分配:扫描所有的输入目标文件,获得他们各个段的长度、属性和位置,之后合并相同段,计算出新段的长度和位置,并且将所有符号表合并为一个全局符号表
符号解析与重定位:使用第一步收集到的信息,读取输入目标文件中的重定位信息,进行符号解析与重定位、调整代码中的地址等(地址分为绝对和相对)
在汇编之后,得到一个目标文件(obj,.o格式),大体如图所示
由于每个编译得到的目标文件都或多或少地有引用到外部文件符号(变量/函数等),所以在目标文件中此时符号的地址还是待定状态(由0x00000000或者其他立即数代替),而静态链接就是将各个目标文件整合并确定各个待定符号的具体地址,从而成为可执行文件。具体分为两个关键步骤:
空间与地址分配:扫描所有的输入目标文件,获得他们各个段的长度、属性和位置,之后合并相同段,计算出新段的长度和位置,并且将所有符号表合并为一个全局符号表
符号解析与重定位:使用第一步收集到的信息,读取输入目标文件中的重定位信息,进行符号解析与重定位、调整代码中的地址等(地址分为绝对和相对)
相关文章推荐
- Java编译原理(有感)
- 程序员的自我修养 ch4 静态链接
- 编译与静态链接
- Linux下编译一个静态链接的程序的注意点
- 编译busybox,动态链接与静态链接的选择
- Android 编译静态链接的可执行文件
- 编译与静态链接
- 《读书笔记》程序员的自我修养之编译和链接
- 程序员的自我修养--编译链接资料收集
- 编译原理作业有感
- Tensorflow编译和CNTK部署到Android失败有感
- 读loki有感 : 编译事(而不是运行时)的断言(assert)
- 编译有哪些阶段,动态链接和静态链接的区别 c++
- 程序员的自我修养——编译和链接
- 编译Linaro的Android内核有感
- 读《JavaScript大师Nicholas C. Zakas谈TypeScript》有感,也谈编译js问题
- 《程序员的自我修养》--静态链接
- 程序员的自我修养-编译,链接和库--学习笔记
- windowX64 vs2012环境下静态链接编译32位libcurl 支持openssl
- 属于自己的《程序员的自我修养》之编译和链接