链接脚本
文件格式名: .lds
SECTIONS{
//精确控制了输入段在输出文件中的顺序、位置和所在段
.= 0X87800000;
//. 为地址符号,该处申明链接的起始地址
.text:
//.text代表从上述地址(代码段的起始地址)开始填入代码段信息
{
start.o //其中一部分代码段
*(.text) //表示剩余所有代码段
}
.rodata ALIGN(4) : {*(.rodata)}
//常量段信息,ALIGN(4)代表4个字节对齐
.data ALIGN(4) : {*(.data)}
//初始化的变量(初始化不为0)信息
__bss_start = .;
//此处的.代表bss段的起始地址,将其赋值给.bss
.bss ALIGN(4) : {*(.bss)}
__bss_end = .;
//bss段结束地址,效果同上
}
详细介绍见:https://blog.youkuaiyun.com/dongdong0071/article/details/86498209
**
1. text段
.text --代码段,存放程序执行代码的区域。
**
**
2. data段
初始化(初始化不为0)的数据段(变量),存放程序中已初始化的全局变量。
**
**
3. bss段
未初始化或初始化为0的数据段,分为两种:bss、COMMON
bss -> 未初始化或初始化为0的静态变量,以及初始化为0的全局变量;
COMMON -> 未初始化的全局变量。
故上述代码可写为:
__bss_start = .;
.bss ALIGN(4) : {*(.bss) *(COMMON)}
__bss_end = .;
**
**
4. rodata段
只读数据段,存放C中字符串和常量(一般为#define定义的常量,像立即数这种常量就不在rodata中)
**
**
5. heap堆
存放进程运行中被动态分配的内存段,大小并不固定,可用malloc、free申请释放内存
**
**
6. stack栈
存放程序临时创建的局部变量及函数调用压栈入栈(注:stack申明的局部变量存放在数据段)。
**