我目前正在尝试让我编写的程序在裸机arm设备上运行。由于我还没有该设备,因此我尝试在使用qemu模拟的arm仿真器上运行代码。
我使用以下命令运行我的代码:
即使我使用其他板子设置,执行也会一直停在同一个点。这是它被卡住的地方(一些openSSL代码片段):
在0x391e4执行指令后,$pc改变为0x391e6而不是0x391e8。由于这不是一个有效的地址,因此在执行时它会跳转到文件开头。如果我在调试器中将$pc更改为正确的值,则可以到达0x391e8,但$pc再次设置为错误值(0x391ea)。我无法使用其他代码重现此行为。
以下是发生问题之前主要寄存器的转储内容。
我使用以下命令运行我的代码:
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
bx r12
,而且 r12 的最低有效位被设置了 - 这里唯一“行为异常”的似乎是您的编译器/链接器,它以某种方式具有 Thumb 符号,看起来像是 ARM 代码的一部分。 - Notlikethat