не может получить доступ к памяти по адресу 0x10084 при попытке установить точку останова через GDB - PullRequest
0 голосов
/ 10 декабря 2018

Я написал эту простую ассемблерную программу (на основе учебника, только слегка измененную).

@ 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 и

    .global main
main:

вместо

    .global _start
_start:

, я предполагаю, что именно здесьможет возникнуть ошибка (хотя не понятно, как это приводит к невозможности установить точку останова через gdb, при этом не возникает никакой ошибки при сборке и компоновке).Я был бы очень признателен, если бы кто-нибудь мог пролить свет на это для меня.Заранее спасибо!edit: спросив, как может выглядеть вывод 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 ,однако затем, во время разборки и компоновки, я получаю сообщение об ошибке, указывающее, что точка входа не найдена.

edit: Учитывая адрес точки входа, я снова запустил программу, используя gdb, затем установил точку останова науказанный адрес.Это было сделано без жалоб, и при запуске выполнение действительно останавливается в точке останова.Таким образом, проблема заключается в том, что адрес 0x10084 , который GDB хочет использовать для моей команды breakpoint linenum , просто не соответствует адресам, которые действительно имеют инструкции в соответствующих строках.

Использование команды gdb информационная строка 'linenumber' только подтверждает мое предположение.Он печатает адреса памяти, и я действительно могу установить точки останова для напечатанных адресов, но когда я пытаюсь установить точку останова, указав номер строки, gdb всегда хочет использовать 0x10084 и завершается неудачей.

У кого-нибудь есть идея, как возникает такое поведение и какие могут быть способы его устранения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...