链接脚本SECTIONS逐行深度解析

链接脚本SECTIONS是嵌入式 / 裸机开发 中最经典的链接脚本(linker script)核心代码,作用是告诉链接器:如何把多个 .o 目标文件合并成一个可执行文件,以及代码、数据在内存 / Flash 中的存放位置

复制代码
SECTIONS{
    . = 0x87800000;
    .text :
    {
        start.o
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : {*(.data)}
    __bss_start=.;
    .bss ALIGN(4) : {*(.bss)*(COMMON)}
    __bss_end=.;
}

逐行逐句解析

1、SECTIONS{...}

含义:链接脚本的核心关键字,表示里面包裹的内容是段(Section)布局规则

作用:告诉链接器:我要手动指定代码、数据段的内存排布,不要使用默认规则

2、. = 0x87800000;

. 链接器当前地址计数器。可以理解为下一个数据要存放的内存地址

= 赋值操作

整体含义:把当前地址计数器设置为0x87800000

作用:从内存地址0x87800000开始存放程序的所有内容(这是整个程序的起始地址,嵌入式中通常是芯片的内存/Flash基地址。)

3、.text:

.text 代码段,存放程序执行的机器指令(函数、代码)。

: 段定义的固定语法,后面{}里是这个段包含的内容

4、start.o

含义:优先把start.o文件的所有内容放在代码段最开头

关键作用:

嵌入式系统启动时,CPU从程序第一条指令开始执行。我们必须把启动文件(start.s编译出来的start.o)放在最前面,保证CPU最先执行初始化代码(设置栈、关闭看门狗等)。

5、*(.text)

* 通配符,表示所有其他目标文件(.o)。

*(.text) 把所有其他.o文件的代码段,全部合并到这里。

顺序:先放start.o,再放其他所有代码

6、.rodata ALIGN(4) : {*(.rodata*)}

.rodata 只读数据段,存放程序中的常量(const变量、字符串常量)。

ALIGN(4) 4字节对齐。作用:让这个段的起始地址是4的整数倍(0、4、8...),提高CPU读取效率,嵌入式必须对齐。

*(.rodata*) 把所有文件的.rodata、.rodata.xxx段全部收进来

7、.data ALIGN(4) : {*(.data)}

.data 已初始化数据段,存放初始化过的全局变量、静态变量。

*(.data) 合并所有文件的数据段。

8、__bss_start=.;

__bss_start 自定义变量(链接器符号)

=. 把当前地址计数器的值赋给这个变量

含义:记录BSS段的起始地址,存入符号__bss_start

作用:C语言启动代码会用到它,用来清空BSS段(就是清空这些地址里面存放的值)

9、.bss ALIGN(4) : {*(.bss)*(COMMON)}

.bss 未初始化数据段,存放未初始化/初始化为0的全局变量、静态变量。如int a;static int b=0;

特点:BSS段不占用可执行文件空间,只在运行时占用内存,程序启动时必须清零

*(COMMON) 包含公共块(GCC编译器的未初始化全局变量)

10、__bss_end=.;

含义:记录BSS段的结束地址

作用:配合__bss_start,启动代码可以循环把这段内存全部清零


整体内存排布(最终布局)

链接器会按照这个顺序把程序放在内存中:

复制代码
0x87800000 开始
+-------------------------+
| .text      代码段       |  (start.o 最先放)
+-------------------------+
| .rodata    只读数据段    |常量
+-------------------------+
| .data     已初始化数据段 |有初值的变量
+-------------------------+
| __bss_start             |开始标记
+-------------------------+
| .bss      未初始化数据段 |无初值变量
+-------------------------+
| __bss_end               |结束标记
相关推荐
Zixhy11 分钟前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析
linux·服务器·网络·数据库·c++
迷途之人不知返25 分钟前
【进程】-4-进程状态(2):Linux中的进程状态
linux
傻啦嘿哟7 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670797 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄7 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh8 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei8 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界9 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
bosins9 小时前
WSL 迁移指南:如何将 Linux 环境完整复制到另一台电脑
linux·运维·服务器
繁星蓝雨10 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进