1.前言
近期在使用STM32CubeIDE for VSCode调试STM32的Boot-App时,发现一个问题:虽然修改了链接文件中的Flash的起始地址,但是elf中的地址一直未改变。
2.问题分析
通过STM32CubeMX2生成的CMake工程中,code区的起始地址是通过链接文件中的memory来定义的,如需调整,修改下图中的地址即可:
图1. 链接文件中的内存分配定义

我将ROM的起始地址由0x08000000修改为0x08001000后,在点击"build"按钮编译,得到如下的编译结果:
图2. 修改链接文件后的编译结果

仔细查看编译的输出信息,会发现编译器在这里什么也没干,这是为啥呢?我明明修改了ld文件中的flash地址了呀!
事实上,这是因为在默认生成的CMakelist文件中,并没有把ld文件当成链接依赖,自然不会每次编译都去重新加载链接文件。
3.解决方法
知道了原因,那么要想让CMake工程每次执行"build"时,都去加载ld链接文件的话,可以清除当前的编译结果,或者手动添加依赖命令,我们一起来看看具体的实现吧。
3.1方法一
简单的做法就是每次执行"build"之前,手动清理工程的编译结果,然后再次编译即可,这个方法不需要任何额外的命令,缺点就是每次都要手动清除,这对工程师明显不是友好的方法。
图3. 方法一 手动清除和编译

3.2方法二
我们可以把链接文件标记为链接阶段的依赖(在CMake工程的根目录下的CMakelist文件中添加),这样就可以每次执行"build"时,自动加载ld文件,任何ld文件的改变都能自动感知了。


上述依赖就是指定路径,并自动搜索可用的链接文件。添加后的结果如下图所示:
图4. 方法二 自动链接脚本编译

4.小结
链接文件改动是否能导致重新编译取决于依赖关系。现在AI工具非常丰富,我们可以让AI工具对这里的依赖给出详细的解答,这样就能做到对添加的内容知根知底。
点击下载《LAT1724 STM32CubeIDE for VSCode 修改链接文件中的起始地址无效?》原文档。
重要通知 - 请仔细阅读
意法半导体公司及其子公司 ("ST")保留随时对 ST 产品和 / 或本文档进行变更的权利,恕不另行通知。买方在订货之前应获取关于 ST 产 品的最新信息。 ST 产品的销售依照订单确认时的相关 ST销售条款。 买方自行负责对 ST 产品的选择和使用, ST 概不承担与应用协助或买方产品设计相关的任何责任。 ST 不对任何知识产权进行任何明示或默示的授权或许可。 转售的 ST 产品如有不同于此处提供的信息的规定,将导致 ST 针对该产品授予的任何保证失效。 ST 和 ST 徽标是 ST 的商标。若需 ST 商标的更多信息,请参考 www.st.com/trademarks。所有其他产品或服务名称均为其 各自所有者的财产。 本文档是ST中国本地团队的技术性文章,旨在交流与分享,并期望借此给予客户产品应用上足够的帮助或提醒。若文中内容存有局限或与ST 官网资料不一致,请以实际应用验证结果和ST官网最新发布的内容为准。您拥有完全自主权是否采纳本文档(包括代码,电路图等)信息, 我们也不承担因使用或采纳本文档内容而导致的任何风险。 本文档中的信息取代本文档所有早期版本中提供的信息。 © 2020 STMicroelectronics - 保留所有权利