1.编译链接原理
编译链接全过程分为:预编译,编译、汇编、连接四个过程
预编译阶段:处理源代码里面以“#”开始的预编译指令
但是不处理 #pragma lib
#pragma link 这些都是持续到链接阶段
展开宏定义,删除注释。生成.i文件
编译:在预编译完的基础上进行词法分析、语法分析、语义分析还有优化后生产相应的汇编代码文件。这个过程是核心部分也是最复杂的部分。生成.s文件
汇编:汇编器将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都是一条机器指令。这相比编译器的工作稍微简单一些。生成.o文件。即这里就生成了.o文件。目标文件的格式:linux ELF windows PE 这都是COFF格式的变种
链接:
第一步:文件段合并,符号表合并后,进行符号解析
.text.text……各个段都要进行合并并调整段的大小和偏移量;符号解析:对所有符号的引用,都要找到该符号定义的地方,解析成功后,给所有的符号分配虚拟地址,
第二步:符号的重定位(链接的核心)
在代码段之前用0填充的地址,全部更改成已经分配好的地址。
?符号什么时候分配虚拟地址?
链接过程,链接过程的第一步,符号解析完成后
?.o文件和可执行文件的格式组成有什么区别?
各种段大都相同,但是可执行文件多了一个 program headers 这个段由两个load——>告诉系统运行这个程序的时候把那些内容加载到内存当中(就代码段和数据段)。
2.虚拟地址空间分布
第一部分相关面试题目总结:
1.编译链接全过程
2.堆和栈的区别
3.栈和堆的大小,申请一个整型数组最大可以达到多少?
4.初始化全局变量和未初始化全局变量有什么区别?
5.局部内存变量存在哪里?
6.虚拟地址空间的内存布局?
7.说一下C++的内存管理
8.全局变量和局部变量的区别(生命周期、作用域、默认值、内存区域、链接属性)
9.编译时,代码优化都做了哪些事?
10.链接过程分为哪些?说一下动态链接
11.编译连接过程,在什么平台上,动态库出错了,怎么找
12.讲一下函数调用堆栈过程