[STM32F2] 如何将 arm-none-eabi 头文件添加到链接器脚本段的受保护区域

[复制链接]
590|13
zhouyou99 发表于 2025-10-17 21:27 | 显示全部楼层 |阅读模式
我已经在受保护区域中加入了一些文件,通过指针调用来自不同区域的未受保护区域的函数,但是当我修改未受保护区域中的函数时,理想情况下受保护区域不应受到影响,但它确实受到了影响,并且这些更改反映的地址都在 memcpy、strcpy、memcmp 函数内部。
那么是否有单独的方法将这些文件添加到链接器脚本的受保护部分?



公羊子丹 发表于 2025-10-31 07:14 | 显示全部楼层
我感觉你描述的现象挺像 libc 的函数(比如 memcpy、strcpy)被链接到了未受保护段,导致更新函数区时间接影响受保护区。建议你在链接脚本里手动把 .text.libc 段映射到受保护区看看。
周半梅 发表于 2025-10-31 07:15 | 显示全部楼层
你有检查过编译选项吗?有时候优化等级或者 --specs=nosys.specs 这些参数会导致函数合并或者重定向到新区域。可以试着关掉 LTO 看看有没有区别。
帛灿灿 发表于 2025-10-31 07:16 | 显示全部楼层
我之前在 STM32F4 上碰到过类似情况,最后发现是启动文件里没有把库函数所在段单独声明,链接器自动放在默认段里了。建议在 linker script 里显式定义一个段给这些函数。
童雨竹 发表于 2025-10-31 07:17 | 显示全部楼层
其实 arm-none-eabi 的函数库在链接阶段会自动链接到 libc.a 或 libgcc.a,如果你要保护它们,可能得自己重新编译一份静态库再放进受保护区域。
万图 发表于 2025-10-31 07:18 | 显示全部楼层
我建议先用 nm 工具看一下 memcpy 和 strcpy 的符号地址,是不是确实被放在了非保护区,这样能定位得更准一点。
Wordsworth 发表于 2025-10-31 07:19 | 显示全部楼层
看起来有点像是指针表被更新导致跳转到了新地址,不如试试在保护区加上 CRC 校验,看看是不是执行时加载到了错误的函数地址。
Bblythe 发表于 2025-10-31 07:20 | 显示全部楼层
有可能你使用的编译器版本对标准库链接方式有变化,可以试试换成同版本的 newlib 或者指定 --specs=nano.specs,看符号位置是否一致。
Pulitzer 发表于 2025-10-31 07:21 | 显示全部楼层
这类问题挺 tricky 的,我建议先写一个最小复现工程,只放几个函数和链接脚本,观察下受保护段和未保护段的相互影响范围。
Uriah 发表于 2025-10-31 07:22 | 显示全部楼层
从逻辑上讲,受保护区的指针如果指向外部函数,那函数更新后地址确实会变。你可以考虑用函数跳板或者固定地址表来解耦。
Clyde011 发表于 2025-10-31 07:23 | 显示全部楼层
我怀疑你是想做类似 secure boot 分区的设计吧?如果是这样,建议把 C 库函数也放进 boot 区域或者封装成独立静态模块,不要直接链接到外部应用段。
yiy 发表于 2025-10-31 12:37 | 显示全部楼层
建议你在链接脚本里手动把 .text.libc 段映射到受保护区看看。
OKAKAKO 发表于 2025-10-31 17:12 | 显示全部楼层
指针调用来自不同区域的未受保护区域的函数
yiy 发表于 2025-11-2 14:57 | 显示全部楼层
你可以考虑用函数跳板或者固定地址表来解耦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

67

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部