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文件调试信息