1. 问题复现操作步骤
- 使用 STM32CubeMX 生成 STM32C5 系列 CMake 工程,使用 STM32CubeIDE for VSCode 打开;
- 打开路径
user_modifiable > Device > STM32C562RET6 > stm32c562xe_flash.ld链接脚本; - 修改 MEMORY 段 ROM 起始地址:
ROM(rx) : org = 0x08001000, len = 0x80000; - 保存 ld 文件,直接点击 Build;
- 读取输出 elf,观察程序加载地址,仍然是
0x08000000,修改无效,编译无报错。
资料获取:实战经验 | LAT1724 STM32CubeIDE for VSCode修改链接文件中的Flash起始地址无效?
2. 方案一:手动 Clean Rebuild All Projects(临时调试方案)
对应文档图 3 操作截图要点
- 在 VSCode 左侧,打开 STM32CubeIDE 插件工具栏(三角形图标);
- 点击工程配置右侧三个点更多菜单;
- 选择
Clean Rebuild All Projects,执行完全清理 + 全量重新构建; - 构建完成,此时 ld 脚本修改会生效,elf 地址更新。
注意:该操作每次改动 ld 脚本都需要重复执行;普通 Build 按钮无法触发全量重构建,依旧会复用旧链接产物。
3. 方案二:CMakeLists 添加链接脚本依赖(正式产品工程推荐)
- 打开工程根目录
CMakeLists.txt; - 将文档给出完整 CMake 片段粘贴到 CMakeLists 合适位置;
# Ensure linker script changes trigger re-link -------------------------
set(CMSIS_DEVICE_DIR "${CMSIS_RTE_FOLDER}/Device/${CMSIS_Dname}")
file(GLOB DEVICE_LD_SCRIPTS "${CMSIS_DEVICE_DIR}/*_flash.ld")
list(LENGTH DEVICE_LD_SCRIPTS DEVICE_LD_COUNT)
if(DEVICE_LD_COUNT EQUAL 1)
list(GET DEVICE_LD_SCRIPTS 0 LINKER_SCRIPT)
set_property(TARGET ${CMAKE_PROJECT_NAME} APPEND PROPERTY LINK_DEPENDS
"${LINKER_SCRIPT}")
elseif(DEVICE_LD_COUNT GREATER 1)
message(WARNING "Multiple linker scripts found in ${CMSIS_DEVICE_DIR}; select one explicitly.")
else()
message(WARNING "No linker script found in ${CMSIS_DEVICE_DIR}; relying on DFP fallback/template.")
endif()
- 保存 CMakeLists 文件,执行一次 CMake Configure(重新加载 CMake 配置);
- 后续修改
*_flash.ld链接脚本,保存后直接执行普通 Build,CMake 自动感知 ld 变更,触发重新链接。
文档图 4:CMakeLists 添加完成后的代码界面,添加 Configure 之后,构建系统识别链接脚本依赖。 警告处理:编译输出警告 “Multiple linker scripts found”,代表 DFP 目录存在多个 ld 脚本,glob 通配匹配存在歧义,需要硬编码指定
LINKER_SCRIPT变量为实际使用脚本完整路径。
4. 修改后验证方法
两种验证方式,任选其一确认 Flash 地址修改真正生效:
- 仿真调试:下载固件,查看寄存器、内存窗口,观察程序复位后代码起始地址;
- 读取 elf 信息:使用 readelf 工具读取 elf 文件 Program Header,核对 ROM 段的 LMA 加载地址是否和 ld 脚本修改后的 org 地址保持一致。
5. 工程检查清单
- 确认工程是 CubeMX 导出 CMake 工程;Make 工程不受该问题影响;
- 方案二:CMakeLists 已经粘贴依赖代码,已经执行 Configure;
- 构建日志观察是否输出警告:多 ld 脚本、找不到 ld 脚本警告;
- 修改 ld 脚本后,只点 Build,不手动 Clean,验证 elf 地址是否更新;
- CI 脚本场景:使用方案二,不依赖手动 Clean 操作;
- Class‑B 功能安全项目:必须加入该段依赖,避免 RAM 段修改不生效。
阅读全文
300