GCC C++17中inline变量结合section属性的内存定位异常问题
问题:inline变量搭配section属性导致内存段放置异常
背景
在C语言环境下,我曾在头文件my_file.h中使用如下宏定义处理变量声明:
#ifdef my_fileC # define extint #else # define extint extern #endif
之后通过extint int32_t my_var;的方式声明变量,以此在不同编译单元中控制变量的定义/外部引用状态。
切换到C17后,我弃用了上述extint宏,改用C17原生支持的inline int32_t my_var;声明变量,正常场景下程序运行无问题。
异常情况
当我为需要放置到预定义内存区域的变量添加section属性时,问题出现:使用inline int32_t my_var __attribute__ ((section("my_section")));声明后,只有一个变量被正确放置到目标段,其余变量的内存位置均错误。程序编译、链接无报错,但运行到特定逻辑节点时崩溃——除了用inline替换extint外,源码无其他改动。
环境信息
- 开发环境:STM32 Cube IDE,搭载GNU工具链10.3-2021.10
- 目标芯片:STM32H7
相关链接脚本片段
my_data_section (NOLOAD) : /* (NOLOAD) forces not to create init data in hex file */ { . = ALIGN(4); *(my_section) . = ALIGN(4); } >RAM_D2
请问是否有人遇到过类似问题?这是编译器/链接器的bug,还是我的用法有误?我的项目规模较大,无法简化为最小复现案例,但可以提供两种写法对应的map文件。
内容的提问来源于stack exchange,提问作者Martin_from_K
相关产品推荐
相关产品推荐

