Я написал эту простую ассемблерную программу (на основе учебника, только слегка измененную).
@ 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 и завершается неудачей.
У кого-нибудь есть идея, как возникает такое поведение и какие могут быть способы его устранения?