第三章 目标文件里有什么

3.1目标文件定义

源代码编译但未链接的中间文件。
根据定义 库也是和目标文件一个格式(linux下ELF),库一起和编译后的源代码链接

3.2目标文件构成

编译后源代码放在代码段(.text)、初始化全局变量和静态局部变量保存在数据段(.date)、未初始化的全局变量和静态局部变量保存.bss段(因为未初始化的变量默认0,放在数据段占内存空间)

编译后代码被放到代码段和数据段分开存放优点
1.代码段设置可读,数据段设置可读写,防止程序指令被误改;
2.cache分成指令缓存和数据缓存,有利于提高cache缓存命中率;
3.最重要只读的指令和只读数据可以共享,极大节省内存。

3.3挖掘SimpleSection.o(一个目标文件代表剖析)

在这里插入图片描述
3.3.1代码段
在这里插入图片描述
上面是十六进制,下面是对应的汇编

3.3.2数据段和只读数据段
只读数据段可以放const关键字修饰,printf里的%d字符串常量两个都有放,看编译器,可以放在.rodate,直接放进ROM,十分方便。

3.3.3BSS段
在这里插入图片描述
为什么static修饰可以放在.bss段?

3.3.4其他段
在这里插入图片描述

3.4 ELF文件结构

在这里插入图片描述
3.4.1文件头
描述整个目标文件

3.4.2段表
管理目标文件里不同段的信息。
在这里插入图片描述
3.4.3重定位表

3.4.4字符串表
用于记录不确定长度的字符串偏移量

3.5 链接的接口——符号

在链接中,函数和变量统称为符号,函数名和变量名称为符号名,通过各个目标文件的符号值(地址)相互引用,达到链接效果。

3.5.1ELF符号表结构

3.5.2特殊符号
存在链接器的链接脚本中,可直接声明并引用

3.5.3符号修饰和函数签名
不同语言编译后防止产生同名的情况
通过函数签名应对C++不同的名称空间,函数返回值和参数

3.5.4extern“C”
在这里插入图片描述
3.5.5弱符号与强符号
在这里插入图片描述
强弱符号
在这里插入图片描述
强弱引用

3.6 调试信息

在这里插入图片描述
目标文件调试信息占内存 可用strip去掉ELF文件调试信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值