You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:07:14