3. 编译和链接原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
预编译(预处理):#开头的命令处理掉
编译:gcc -O1(O2 O3)优化级别
汇编:生成.o可重定位二进制文件(特定平台的机器码0101这种)

.a :Linux静态库文件 .lib :Windows下的静态库文件
链接:所有.o文件+静态库文件.lib参加链接

  1. 步骤一:所有.o文件段的合并,符号表合并之后,进行符号解析
  2. 步骤二:符号的重定位(重定位),这是链接的核心

在这里插入图片描述
main文件中 gdata、sum引用的是外部的变量、函数,在main.o中是否会产生符号呢?
在这里插入图片描述
objdump -t 命令:查看符号表:
在这里插入图片描述
l:local
g:global
在main.o的段信息中,gdata 、_z3sumii在main文件中用到他们了,但是却不知道是如何定义的,所以符号暂时只能给他们UND(undefined)。而在sum文件中知道sum函数 gdata知道如何定义的,所以有符号!
在编译过程中,符号是不分配虚拟地址的!可以看见编译完成后,main.o这些地方是地址为0:
在这里插入图片描述
readelf -S main.o:查看程序段信息

链接:
main.o sum.o
各个段就要进行合并,.text .data .bss等合并在一起,UND在合并时,会在其他文件找这个变量,找到该符号定义的地方(text data 或者bss等)符号解析成功后,给所有的符号分配虚拟地址,data gdata sum这些都要有地址,之前那些地方都是0000,现在需要写上具体的地址,这叫做符号重定向!

手动链接:入口函数指定为main,可以看出所有变量、函数都有了具体的地址,*UND*也消失了!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
a.out在磁盘中,elf header包含程序的入口地址,program headers 告诉系统加载text data段,加载到内存中!把text,data bss段分别映射到进程的虚拟地址空间(上几个博客讲过进程的虚拟空间),执行地址映射页面异常处理程序分配物理内存!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值