
前言 STM32CubeIDE 是 ST 推出的免费集成编译环境,基于 Eclipse 开源框架,集成了 GCC、GDB 等免费的编译器、链接器,支持 STM32 全系列芯片,可以创建 C/C++工程,支持调试、波形实时仿真、一键下载等。 在实际项目中,有时候需要对内存进行细分时,比如指定变量/函数/文件到特殊地址等等,KEIL 可以通过“*.sct”文件来实现;IAR 可以通过“*.icf”文件来实现;对于 STM32CubeIDE,可以通过“*.ld”链接文件来实现。+ z. Y: s; ]: C4 h 本文将介绍 GCC 的“*.ld”链接文件的常见用法,供大家参考使用。 基本概念 “*.ld”链接文件组合了许多对象和归档文件,重新定位它们的数据并绑定符号引用。通常,编译程序的最后一步是运行“*.ld”链接文件。 通俗来讲,链接文件可以描述输入文件中的段,将其映射到输出文件中,并指定输出文件中的内存分配。2 @. Y% [0 \* S* V+ f. } d3 } 以下就是链接文件涉及到的相关概念:1 ^: ?4 W8 N2 |& T 内存(Memory) 语法:! z2 J# `# S7 K# ~ j
注释:这里的“attr”只能由以下特性组成: ‘R’ Read-only section ‘W’ -- Read/write section ‘X’ -- Executable section ‘A’ -- Allocatable section& @0 x' } ?, A; S ‘I’ -- Initialized section" C" \3 q& F c9 u4 _& ^' C5 e ‘L’ -- Same as ‘I’( M6 ^# h% O# d8 a& f# K ‘!’ -- Invert the sense of any of the attributes that follow 0 ~( E/ l* ^5 `% e 示例:
注释: “xrw”表示“RAM”区是可读、可写和可执行的,且 RAM 的起始地址为“0x20000000”,长度为 36K。 “rx”表示“FLASH”区是可读和可执行的,FLASH 的起始地址为“0x08000000”,长度为 128K。) [$ K% K% \8 f+ A/ _* e# @ 0 g! }3 e) o$ q0 T, I( K 段(Section) 5 P$ T9 @9 l1 ^ Section 有 loadable(可加载) 和 allocatable(可分配)两种类型。不可加载也不可分配的内存段,通常包含某些调试信息。 loadable(可加载)是指:程序运行时,该段内容应该被加载到内存中。 / @0 x5 K; Z) C5 D) H allocatable(可分配)是指:该段的内容应该被预留出,但不应该加载任何别的内容(某些情况下,这些内存必须归零)。; \7 K/ ?, a! h7 Y( Y8 l “可加载”和“可分配”的 section 都有两个地址:“VMA”和“LMA”。& i6 }( a& l3 b VMA(the virtual memory address):这是运行输出文件时,该 section 的地址。VMA 是可选项,可以不设置。 LMA(load memory address):这是加载 section 时的地址。4 K1 ~. p' R- `8 t" q 在大多数情况下,这两个地址是相同的。当然也可以不相等,比如下面的例子就是 LMA 和 VMA 不同的案例:数据段被加载到 ROM 中,然后在程序启动时复制到 RAM 中(通常用于初始化全局变量)。此时 ROM 地址就是LMA,RAM 地址就是 VMA。 7 a/ ^ B2 U& |# q' }0 b! H 语法:
注释:大多数的段仅使用了上述的一部分属性。 示例:% s. A+ u$ }0 | D/ d4 {
注释:上述示例中“.isr_vector”的 LMA 与 VMA 是相等的。“& b g# U# \4 j9 }2 V U .data”因为有“>RAM AT> FLASH”的修饰,表示.data 段的 VMA 为 RAM,LMA 为 FLASH。即.data 段的内容会放在 FLASH 中,但是运行时,会加载到 RAM 中。 % p- l' j- f! ]/ |- _! _# B' I9 \ 完整版请查看:附件 I6 b9 I E8 Z$ ^" r/ q |
LAT0816_STM32CubeIDE实用技巧之ld链接文件_v1.0.pdf
下载398.99 KB, 下载次数: 41
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
新版STM32Cube for Visual Studio Code开发体验
【STM32N6570-DK评测】摄像头video encoder
实战经验 | STM32CubeIDE实用技巧之工程联调
【STM32H745I-DISCO】基于TouchGFX的工业控制器界面设计
【下载问题解决】关于ST官网下载软件问题解决
【STM32N6570-DK评测】开发环境及LED debug
实战经验 | 基于STM32CubeIDE下载TouchGFX GUI应用的出错分析
实战经验 | 如何修改STM32Cube固件包的存储位置
兔哥的杂谈【002】——如何性价比更高地去编译STM32