杰发科技AC7840——编译链接过程

链接脚本(.ld)与启动文件(.s)的关系

概述

在嵌入式 ARM 项目中,链接脚本(.ld)和启动汇编文件(.s)通过符号名在链接阶段建立联系。启动文件引用符号,链接脚本定义符号地址。


1. 启动文件定义符号引用

启动文件 startup_ac7840x.s 中引用了链接脚本定义的符号:

asm 复制代码
; 第 46-54 行,定义数据段和 BSS 段的地址引用
.word  _sidata    ; Flash 中 .data 初始值地址
.word  _sdata     ; RAM 中 .data 段起始地址
.word  _edata     ; RAM 中 .data 段结束地址
.word  _sbss      ; .bss 段起始地址
.word  _ebss      ; .bss 段结束地址

; 第 71 行,设置栈指针
ldr   sp, =_estack   ; 栈顶地址

2. 链接脚本定义这些符号

链接脚本 ac7840x_flash.ld 中定义了上述符号的具体地址:

ld 复制代码
_sidata = .;              /* 第 83 行,Flash 中 .data 初始值地址 */
_sdata = .;               /* 第 94 行,RAM 中 .data 段起始 */
_edata = .;               /* 第 99 行,RAM 中 .data 段结束 */
_sbss = .;                /* 第 124 行,.bss 段起始 */
_ebss = .;                /* 第 131 行,.bss 段结束 */
_estack = .;              /* 第 159 行,栈顶地址 */

3. 链接阶段整合

编译和链接的流程:

复制代码
汇编编译:  startup_ac7840x.s  →  startup_ac7840x.o  (符号未解析)
C 编译:    main.c            →  main.o
链接:      gcc *.o -T ac7840x_flash.ld  →  Demo.elf
                ↓
        链接器用 .ld 中定义的地址
        替换 .o 中的符号引用

在链接阶段,链接器读取链接脚本,确定各符号的最终地址,然后替换目标文件(.o)中所有对这些符号的引用。


4. 实际作用

启动文件 Reset_Handler 使用链接脚本定义的符号完成系统初始化:

asm 复制代码
ldr  r3, =_sidata    ; 从 Flash 读取 .data 初始值
ldr  r0, =_sdata     ; .data 在 RAM 中的起始地址
ldr  r3, =_edata     ; .data 在 RAM 中的结束地址
ldr  r2, =_sbss      ; .bss 起始地址
ldr  r3, =_ebss      ; .bss 结束地址

初始化过程:

  1. .data 段初始值从 Flash 拷贝到 RAM
  2. .bss 段清零
  3. 设置栈指针 sp = _estack
  4. 调用 SystemInit 进行时钟初始化
  5. 调用 main 进入应用程序

5. 内存布局示例

复制代码
Flash (0x00000000):
  ┌─────────────────┐
  │  .isr_vector     │  ← 中断向量表
  ├─────────────────┤
  │  .text           │  ← 程序代码
  ├─────────────────┤
  │  .data 初始值    │  ← _sidata 指向此处
  └─────────────────┘

RAM (0x1FFF0000):
  ┌─────────────────┐
  │  .data           │  ← _sdata ~ _edata
  ├─────────────────┤
  │  .bss            │  ← _sbss ~ _ebss
  ├─────────────────┤
  │  .heap           │  ← 堆区
  ├─────────────────┤
  │  .stack          │  ← _estack 指向栈顶
  └─────────────────┘

总结

  • 启动文件(.s):定义处理器复位后执行的初始化代码,引用链接脚本中的符号
  • 链接脚本(.ld):定义各段在内存中的位置,提供符号的具体地址
  • 联系 :两者通过符号名在链接阶段建立联系,完成系统的内存初始化
相关推荐
意法半导体STM323 小时前
【官方原创】LAT1709STM32C5硬件CRC值的计算话题
stm32·单片机·嵌入式硬件·mcu·crc·微控制器·stm32c5
国科安芯1 天前
低轨卫星姿轨控系统中高可靠嵌入式控制单元的设计与验证
单片机·mcu·低轨卫星·星间链路·卫星姿轨控
国科安芯1 天前
卫星电源管理系统中宽温域低功耗MCU的选型与适应性分析
嵌入式硬件·mcu·抗干扰·抗辐射·宽温
youcans_2 天前
【嵌入式软件AI编程】09. 使用VS Code调试STM32程序
stm32·mcu·ai编程·嵌入式软件·claude code
国科安芯2 天前
寄存器级 Flash 擦除与六轮迭代踩坑实录
嵌入式硬件·mcu·架构·flash·抗辐射·eflash
Groundwork Explorer2 天前
ESP32-C3 SuperMini 排查WIFI收发故障
python·单片机·嵌入式硬件·mcu
星源~3 天前
Linux - Trae Code Linux 环境嵌入式开发指南
linux·mcu·嵌入式·trae code
Lzh编程小栈3 天前
STM32 DMA深度解析|原理、完整工作流程、寄存器、中断联动,嵌入式面试高频考点(F1系列)
c语言·stm32·单片机·mcu·面试
qq_402995753 天前
MOS管的工作原理
嵌入式硬件·mcu
深圳市尚想信息技术有限公司3 天前
HITENX海速芯TM52F1363-SSOP24 8KB Flash存储+EEPROM,国产8位MCU单片机
单片机·mcu·flask·芯片·控制器·海速芯