使用GCC在C语言自定义Flash段中放置多数组的正确方法
你的实现方法是正确的
你当前的代码和链接器脚本搭配,能够准确地将两个常量数组依次存储到Flash的.metadata指定段中,具体原因如下:
代码层面的段指定有效:通过
__attribute__((section(".metadata.FW_SIGNATURE")))和__attribute__((section(".metadata.FW_PUBLIC_KEY"))),GCC会将这两个const修饰的数组强制分配到对应的子段中;加上const关键字,确保数组被放置在只读存储区(Flash),而非RAM,符合嵌入式场景的需求。链接器脚本的布局逻辑匹配:链接器脚本中
.metadata段的定义明确了布局顺序:- 先预留256字节空间并关联
FW_SIGNATURE_START符号,随后通过KEEP(*(.metadata.FW_SIGNATURE))将你的签名数组放入该位置; - 接着处理公钥相关部分,预留128字节空间关联
FW_PUBLIC_KEY_START符号,再放入公钥数组。
其中KEEP关键字能避免链接器因"未直接引用"而优化掉这些metadata段,这在嵌入式固件中是关键保障。
- 先预留256字节空间并关联
需要注意的细节
- 严格匹配数组大小与链接器预留空间:你的
FW_SIGNATURE[256]和链接器的. +=256、FW_PUBLIC_KEY[128]和. +=128完全对应,若数组大小超过预留空间会覆盖后续数据,小于则会留下空闲空间,务必保持一致。 - 对齐设置的合理性:链接器中多次使用
. = ALIGN(4),确保段起始和内部地址按4字节对齐,虽然uint8_t数组本身无需4字节对齐,但该设置能保证整个metadata段的地址规整,避免地址错位问题。
验证方法
编译完成后,可以通过objdump -t <你的可执行文件>或readelf -s <你的可执行文件>查看符号地址,确认FW_SIGNATURE的起始地址等于FW_SIGNATURE_START,FW_PUBLIC_KEY的起始地址等于FW_PUBLIC_KEY_START,即可验证布局是否符合预期。
内容的提问来源于stack exchange,提问作者WITC
相关产品推荐
相关产品推荐

