C++学习-1编译链接原理
编译链接原理
1.预编译
开头的命令
注意以下代码==不是==预编译
1 |
2.编译
3.汇编
x86 ATA 生成.o
4.链接:
符号解析
符号的重定位 核心
**链接主要是将.o文件重定位**查看.o文件详细信息,.o可重定位,不可执行
1 | objdump -t main.o |
查看.o文件符号
以上代码,gdata sum为引用,但是二者都在.o文件中产生了符号
- main —text 在代码段
data —data 在数据段
gdata、sum— ==UND== 引用
第二列 l:loca l;g:global
链接时链接器只能看见g,静态变量是l,
sum 和形参一起生成符号
.o文件组成:
elf文件头 每个段一个文件头
text
data
bss
symbal
section table
编译过程中符号不分配地址
注意到 data、gdata 地址都为0
链接
各个段进行合并 .text<=>.text
对符号的引用(UND) 换成定义 (在其他段寻找) ,且只允许找到一个定义(符号重定义)
符号解析成功后,给所有符号==分配虚拟地址==。 符号的重定向
链接完,成exe/out 可重定向=》可执行
可执行文件
有program headers
内容:两个load,把代码段、数据段 加载到内存,其他不用加载到内存
我408也没白学哈哈哈呜呜
指令角度掌握函数调用过程
1 |
|
main调用sum后,如何回来?
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Yolo-zzy的博客!