尝试通过gdb

时间:2018-12-10 20:50:47

标签: debugging assembly memory arm gdb

我写了这个简单的汇编程序(基于教程,只是稍作改动。)

@ 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 并失败。

有人知道这个行为是如何产生的,可能有什么方法来解决它?

0 个答案:

没有答案