我有一个.out
用arm-none-eabi-gcc -mtune=cortex-m3 --specs=nosys.specs
.
如果我运行 GDBarm-none-eabi-gdb a.out
并disas main
在其上执行,exec
我会得到一个看起来合理的反汇编,这与 C 非常相似,用于这样一个简单的测试。
如果我然后target remote localhost:XXXX
通过 JLink 连接到设备,并且load
,disas main
则不同,而不仅仅是地址;甚至更长。
然而load
,“成功”,因为这样做没有错误,它报告了合理数量的“负载大小”。
如果我更改源,之后的反汇编load
确实会改变,但似乎永远不会像源,并且与直接反汇编可执行文件完全不同,后者与源非常相似。
我最好的猜测是load
没有正确成功,这可能是什么原因?
或者如果从上面看起来它确实正确加载,为什么反汇编如此不同?
更新:
我通过反复手动清除这些地址来验证我所看到disas main
的 load
实际上是它加载的内容(即它没有与内存中“剩余”的东西合并) 。set {long long}0xADDR = 0
因此,出于某种原因load
,似乎确实加载了一些与源精灵中不同的东西。
此外,对我来说看起来不正确的分支之一将流程定向到指令ldr??.w r7, [r4, #4095]
。这到底是什么??
意思 - 它是格式错误和无效的类型,ldr
所以 GDB 打印??
,因此证明load
没有正确执行?