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

STM32CubeIDE中nm输出的$d、$t符号含义及参考资料咨询

关于ARM GCC编译后nm输出中$d、$t符号的含义解析

问题场景

在Windows 10 64位系统的STM32CubeIDE环境中,编译C源码后执行nm FX_LMS.o得到如下符号输出:

F:\STM32CubeIDE\LMS\ANC_fxlms_v1\Debug\Core\Src>nm FX_LMS.o
00000000 b $d
00000298 t $d
00000000 b $d
000000b4 t $d
00000000 b $d
00000544 t $d
00000024 t $d
00000000 b $d
000002b0 t $d
00000000 d $d
000001f8 t $d
00000000 b $d
00000178 t $d
00000000 b $d
00000000 b $d
00000000 b $d
000000f0 t $d
00000000 b $d
00000058 t $d
00000000 b $d
00000000 b $d
00000000 b $d
00000000 b $d
00000000 b $d
00000050 t $d
00000000 b $d
000005ec t $d
00000000 b $d
00000664 t $d
00000000 b $d
00000000 b $d
0000003c t $d
00000000 t $t
.
.
.
00000000 t $t
00000000 t $t
         U ADC_DMAError
         U ADC_Enable
00000001 T ADC_Start_DMA_double
0000010c d aecho.0
.
.
.

本次编译使用的命令如下:

21:04:01 **** Incremental Build of configuration Debug for project ANC_fxlms_v1 ****
make -j8 all 
arm-none-eabi-gcc "../Core/Src/FX_LMS.c" -mcpu=cortex-m7 -std=gnu11 -g3 -DDEBUG -DARM_MATH_CM7 -DUSE_HAL_DRIVER -DSTM32H743xx -c -I../Core/Inc -I"F:/STM32CubeIDE/LMS/ANC_fxlms_v1/Core/Inc/drv" -I"F:/STM32CubeIDE/LMS/ANC_fxlms_v1/Drivers/CMSIS/DSP/Include" -I../Drivers/STM32H7xx_HAL_Driver/Inc -I../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32H7xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF"Core/Src/FX_LMS.d" -MT"Core/Src/FX_LMS.o" --specs=nano.specs -mfpu=fpv5-d16 -mfloat-abi=hard -mthumb -o "Core/Src/FX_LMS.o"

核心问题:上述输出中的$d、$t符号具体含义是什么?有哪些可解释这些符号的参考资料?


符号含义解析

$d符号

  • $d是调试专用符号,由编译器在Debug模式下生成,用于支撑调试器的信息解析(比如行号映射、变量类型追踪等),不会进入最终运行的固件镜像。
  • 符号前的前缀字母表示其所在的内存段:
    • b:该$d符号位于未初始化数据段(BSS),对应调试相关的未初始化辅助数据
    • d:该$d符号位于已初始化数据段(data),对应调试相关的已初始化辅助数据
    • t:该$d符号位于代码段(text),对应调试相关的代码位置标记信息

$t符号

  • $t是编译器生成的本地临时代码符号,对应编译过程中插入的辅助执行代码(比如栈帧初始化逻辑、调试桩、临时计算片段等)。
  • 前缀小写t表示该符号仅具有本地作用域,不会被其他目标文件引用;与之相对的大写T则表示全局可见的函数符号(比如示例中的ADC_Start_DMA_double)。这类符号主要用于编译调试过程,用户代码不会直接调用。

参考资料

  • ARM GNU Binutils文档:arm-none-eabi-nm属于GNU Binutils的ARM移植版本,可通过执行arm-none-eabi-nm --help查看符号类型的简要说明,或查阅GNU Binutils官方手册中关于符号属性的章节。
  • GCC官方文档:在GCC的调试信息生成、代码生成章节中,详细说明了编译器生成这类辅助符号的规则和用途。
  • STM32CubeIDE帮助文档:在IDE内置帮助中搜索"nm工具符号解析"或"GCC编译符号类型",可获取针对STM32嵌入式场景的适配说明。

内容的提问来源于stack exchange,提问作者mohammadsdtmnd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:45:37