我写了这个简单的汇编程序(基于教程,只是稍作改动。)
@ p = q + r + s
@ let q=2, r=4, s=5
@ this version of the simple-equation stores in memory
p: .space 4 @reserve 4 bytes in memory for variable p
q: .word 2 @create 32-bit variable q with initial value of 2
r: .word 4
s: .word 5
.global _start
_start:
ldr r1,q @load r1 with q
ldr r2,r @load r2 with r
ldr r3,s @load r3 with s
add r0,r1,r2
add r0,r0,r3
mov r7,#1 @syscall to terminate the program
svc 0
.end
我使用作为-g -o main.o main.s 汇编程序。 然后我链接目标文件usind ld main.o -o main 然后我执行 gdb main 现在,当尝试在任何行号插入断点时,我得到的错误是该帖子的标题(无法访问地址 0x10084 的内存)。 由于该程序的代码基于教程,因此该教程中的老师使用了codeblocks-project和
.global main
main:
代替
.global _start
_start:
我认为这可能是我的错误出处(尽管不了解如何导致无法通过gdb设置断点,而在组装和链接时没有出现任何错误)。 如果有人能为我阐明这一点,我将非常感激。 提前致谢! 编辑: 被问到 objdump -d main 的输出看起来是什么样子后,我在这里添加了命令的输出:
main: file format elf32-littlearm
Disassembly of section .text:
00010054 <p>:
10054: 00000000 .word 0x00000000
00010058 <q>:
10058: 00000002 .word 0x00000002
0001005c <r>:
1005c: 00000004 .word 0x00000004
00010060 <s>:
10060: 00000005 .word 0x00000005
00010064 <_start>:
10064: e51f1014 ldr r1, [pc, #-20] ; 10058 <q>
10068: e51f2014 ldr r2, [pc, #-20] ; 1005c <r>
1006c: e51f3014 ldr r3, [pc, #-20] ; 10060 <s>
10070: e0810002 add r0, r1, r2
10074: e0800003 add r0, r0, r3
10078: e3a07001 mov r7, #1
1007c: ef000000 svc 0x00000000
readelf -a main 告诉我,我的切入点是 0x10064 。
我已经尝试使用 main 而不是 _start ,但是在拆卸和链接过程中,我收到一条错误消息,告诉我找不到入口点。
编辑: 给定入口点的地址,我再次使用gdb运行程序,然后将断点设置为指定的地址。它这样做没有抱怨,并且在运行时,确实在断点处停止了执行。因此问题似乎是gdb想要用于我的断点linenum 命令的地址 0x10084 与相应行上的指令真正使用的地址不对应有。
使用gdb命令信息行'linenumber'只是确认我 假设。它会打印出内存地址,并且确实可以将断点设置为打印的地址,但是当我尝试设置指定行号的断点时,gdb总是要使用 0x10084 并失败。
有人知道这个行为是如何产生的,可能有什么方法来解决它?