【发布时间】:2015-02-22 17:19:32
【问题描述】:
我的 ARM 环境是
root@linaro-developer:~# uname -a Linux linaro-developer 3.2.0 #7 SMP Thu Feb 28 16:20:18 PST 2013 armv7l armv7l armv7l GNU/Linux
我的程序集是
.section .text
.global _start
_start:
.code 32
#Thumb-Mode on
add r6, pc, #1
bx r6
.code 16
sub r4, r4, r4
mov r0, r4
ldr r2, =0x80047dbc
blx r2
ldr r2, =0x80047a0c
blx r2
但是,当我尝试使用 gdb 进行调试时,pc 不会 sub r4, r4, r4 gdb 状态是
(gdb) x/3i $pc
=> 0x83c8: add r6, pc, #1
0x83cc: bx r6 ;r6 = 0x83d1
0x83d0: stcne 11, cr1, [r0], #-144 ; 0xffffff70
(gdb) x/3i 0x83d1
0x83d1: subs r4, r4, r4
0x83d3: adds r0, r4, #0
0x83d5: ldr r2, [pc, #4] ; (0x83dc)
subs r4, r4, r4 地址为 0x83d1 0x83d1 未对齐
为什么我的汇编代码位于未对齐的地址?
【问题讨论】:
-
pc 会先到 0x83d0,然后再到 0x83d2 (Thumb) 但是,我想执行 'subs r4, r4, r4'。我该怎么办?当我执行我的汇编代码时,它会发生“段错误”
-
触发故障的访问地址是什么?
-
(gdb) x/3i $pc => 0x83c8: 添加 r6, pc, #1 0x83cc: bx r6 0x83d0: stcne 11, cr1, [r0], #-144 ; 0xffffff70 (gdb) ni 无法访问地址 0x0 0x000083cc 的内存?? () (gdb) si 0x000083d0 在?? () (gdb) x/3i $pc => 0x83d0: stcne 11, cr1, [r0], #-144 ; 0xffffff70 0x83d4: ldrmi r4, [r0, r1, lsl #20] 0x83d8: ldrmi r4, [r0, r1, lsl #20] (gdb) ni 0x000083d2 在?? () (gdb) x/3i $pc => 0x83d2: bmi 0x4f45a 0x83d6: bmi 0x5a21e 0x83da: ldcvc 7, cr4, [r12, #576]! ; 0x240 (gdb) c 继续。程序收到信号 SIGSEGV,分段错误。 0x80047dbc 在?? ()
-
Sorry Look this trace is so hard :(
-
哦,0x80047dbc是prepare_kernel_cred地址。为什么这个地址没有映射?我使用
grep _cred /proc/kallsyms命令检查此地址
标签: debugging assembly gdb arm thumb