我目前正试图让我编写的程序在裸金属臂设备上运行。由于我还没有设备,我尝试使用qemu在arm仿真上运行代码。
我使用以下命令运行代码:qemu-system-arm -M realview-pb-a8 -m 128M -nographic -s -S -kernel myprog
。
执行总是在同一点卡住,即使我使用其他板设置。这就是它被卡住的地方(一些openSSL代码):
0x398b4 <EVP_CipherInit_ex+884> ldr r3, [r11, #-24]
0x398b8 <EVP_CipherInit_ex+888> ldr r3, [r3]
0x398bc <EVP_CipherInit_ex+892> ldr r12, [r3, #20]
0x398c0 <EVP_CipherInit_ex+896> ldr r0, [r11, #-24]
0x398c4 <EVP_CipherInit_ex+900> ldr r1, [r11, #-36] ; 0x24
0x398c8 <EVP_CipherInit_ex+904> ldr r2, [r11, #4]
0x398cc <EVP_CipherInit_ex+908> ldr r3, [r11, #8]
0x398d0 <EVP_CipherInit_ex+912> mov lr, pc
0x398d4 <EVP_CipherInit_ex+916> bx r12
[..]
-> 0x391e4 <aes_init_key> push {r11, lr} <- Strange thing happens at this instruction.
0x391e8 <aes_init_key+4> add r11, sp, #4
0x391ec <aes_init_key+8> sub sp, sp, #40 ; 0x28
0x391f0 <aes_init_key+12> str r0, [r11, #-24]
0x391f4 <aes_init_key+16> str r1, [r11, #-28]
紧接在0x391e4处的指令之后,$pc将更改为0x391e6,而不是0x391e8。这不是一个有效的地址,所以它在执行时会直接跳到文件的开头。如果我在调试器中将$pc更改为正确的值,我将达到0x391e8,但$pc再次设置为错误的值(0x391ea)。除了我的代码,我无法用其他代码重现这种行为。
这是在大便发生之前的主寄存器转储。
r0 0xe28db004 -494030844 r1 0x7aeb8 503480
r2 0x7aea8 503464 r3 0x1 1
r4 0x7df98 515992 r5 0x7dfa8 516008
r6 0x0 0 r7 0x0 0
r8 0x0 0 r9 0x0 0
r10 0x60000 393216 r11 0x7ae34 503348
r12 0x391e5 233957 sp 0x7ae08 0x7ae08 <__malloc_av_+252>
lr 0x398d8 235736 pc 0x391e6 0x391e6 <aes_init_key+2>
cpsr 0x200001f3 536871411
下面是
r0 0xe28db004 -494030844 r1 0x7aeb8 503480
r2 0x7aea8 503464 r3 0x1 1
r4 0x7df98 515992 r5 0x7dfa8 516008
r6 0x0 0 r7 0x0 0
r8 0x0 0 r9 0x0 0
r10 0x60000 393216 r11 0x7ae34 503348
r12 0x391e5 233957 sp 0x7e000 0x7e000
lr 0x391e8 233960 pc 0x8 0x8
cpsr 0x200001db 536871387
我该如何解决此问题?这可能是编译器错误吗?
我尝试了以下编译器标志:-marm
-mthumb-interwork
2字节的更改听起来像拇指模式,实际上cpsr
位#5已设置。要么这确实是拇指代码,在这种情况下你错误地分解了它,要么这是arm代码,在那种情况下它在拇指模式下被错误地调用了。