如何判断ARM架构的ELF文件适用于Cortex-A还是Cortex-M?
快速判断ARM ELF目标为Cortex-A/Cortex-M的方法
方法1:查看入口地址最低位(最快,适合绝大多数场景)
Cortex-M系列仅支持Thumb/Thumb-2指令集,规范要求复位入口地址的最低位必须为1,表示进入Thumb执行状态;而Cortex-A系列如果运行传统32位ARM指令集,入口地址会4字节对齐(最低2位为0),即便运行Thumb指令集,大部分场景入口地址最低位也会保持为0。
你给出的示例中readelf -h输出的入口地址是0xcb5,最低位为1,直接可以判定该镜像为Cortex-M目标平台。
方法2:读取ELF架构属性标签
执行readelf -A hello.elf命令,查看输出中的Tag_CPU_arch字段:
- 若值为
v6-M/v7-M/v8-M/v8.1-M,属于Cortex-M系列 - 若值为
v7-A/v8-A/v9-A,属于Cortex-A系列
示例输出参考:
Tag_CPU_arch: v7-M Tag_THUMB_ISA_use: Thumb-2
上述输出直接对应Cortex-M3/M4等平台。
方法3:识别向量表特征
Cortex-M的向量表固定以初始栈顶地址作为第一个表项,通常为SRAM区间地址(常见为0x2000xxxx),第二个表项才是复位入口地址;Cortex-A的向量表开头全部为跳转指令,不存在开头就是可写RAM地址的情况。
可以用objdump -s -j .vector_table hello.elf或者hexdump -C hello.elf | head查看镜像开头的内容验证。
方法4:反汇编看指令集特征
Cortex-M不支持ARM 32位指令,也没有协处理器访问、MMU操作等Cortex-A专属指令,反汇编后如果出现mcr/mrc(协处理器操作)、MMU相关指令,可以判定为Cortex-A平台;如果出现操作MSP/PSP/CONTROL等Cortex-M专属特殊寄存器的msr/mrs指令,可以判定为Cortex-M平台。
内容的提问来源于stack exchange,提问作者Andy Ma
相关产品推荐
相关产品推荐

