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

ARM C编译后如何便捷查看所有常量的赋值情况?

针对ARM编译场景查看常量值的实用方案

直接从编译中间文件提取(最省心)

  • 用预处理器输出:编译时加-E参数,生成预处理后的代码,所有宏常量都会被展开,直接搜目标常量就行。比如:
    arm-none-eabi-gcc -E your_code.c -DXXX=123 -o preprocessed.c
    打开preprocessed.c直接找目标常量的展开值,完全不用碰汇编。
  • 查符号表:编译出目标文件(.o)后,用nm工具看全局常量的符号和值:
    arm-none-eabi-nm -C your_object.o
    输出里会显示常量名和对应数值,要是局部常量被优化没了,就把它改成static const或者全局的,避免被编译器吃掉。

写辅助代码强制暴露常量

  • 搞个极简测试函数:专门针对要查的常量写个小函数,比如:
    #include <stdio.h>
    void show_my_const() {
        printf("%d\n", YOUR_TARGET_CONST); // 替换成你的常量名
    }
    
    编译后用objdump反汇编,哪怕不懂ARM指令,找printf的参数就行——ARM常用R0-R3传参,函数开头附近的mov r0, #xx或者ldr r0, [pc, #xx]对应的就是常量值。大数值会存在常量池里,跟着ldr指令找后面的数值就行。
  • 关优化确保清晰:编译时加-O0,关掉所有优化,这样编译器不会把常量直接嵌进指令或者优化掉,反汇编里能看得更明白。

利用编译器报错信息直接拿值

  • 定义一个临时变量赋值给目标常量,同时加编译参数-Werror=unused-variable:
    int temp = YOUR_TARGET_CONST;
    
    编译器会因为变量未使用报错,很多时候会在错误信息里直接给出常量的具体值(GCC这类编译器支持)。

追踪被优化后的常量

如果常量被编译器优化成指令里的立即数,用objdump -d --disassemble-zeroes your_binary.elf反汇编后搜相关代码:

  • ARM指令里的立即数会以#xx形式出现,比如add r1, r0, #0x20里的0x20就是常量值;
  • 要是数值太大没法当立即数,会用ldr从PC相对地址加载,比如ldr r0, .L1,找到.L1对应的地址,里面存的就是常量值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:47:06