如何在指定section下正确创建变量?MinGW编译后变量未出现在map中
问题:MinGW编译后自定义SECVAR段中未显示指定变量
我通过链接器脚本linker.ld创建了名为.SECVAR的段:
.SECVAR : { *(.SECVAR ) }
在C文件中通过以下代码定义变量并指定其归属该段:
unsigned short Dummy __attribute__((section(".SECVAR")))
但使用MinGW编译器编译后,生成的output.map文件中.SECVAR段下没有Dummy变量。请问如何正确在指定段下创建变量?
解决方法
强制保留未使用的全局变量
MinGW默认会优化丢弃未被引用的全局变量,即使指定了段属性。给变量添加__attribute__((used))属性可以强制编译器保留它:unsigned short Dummy __attribute__((section(".SECVAR"), used));修正链接器脚本语法
脚本中*(.SECVAR )的末尾多余空格可能导致匹配问题,规范写法去掉空格:.SECVAR : { *(.SECVAR) }同时确保该段定义在链接器脚本的合适位置(比如靠近
.data或.bss段),避免链接器忽略。确认编译链接参数
- 若使用了
-ffunction-sections或-fdata-sections选项,必须配合__attribute__((used)),否则链接器的垃圾回收(--gc-sections)会丢弃未引用的变量。 - 链接时明确指定自定义脚本:
gcc your_code.c -T linker.ld -Wl,-Map=output.map -o your_program,确保链接器加载了你的linker.ld并生成正确的map文件。
- 若使用了
验证map文件生成
确保链接时添加了-Wl,-Map=output.map参数,否则可能生成的不是最新的map文件,导致看不到变量。
内容的提问来源于stack exchange,提问作者Priya
相关产品推荐
相关产品推荐

