Устранение неполадок при сборке кода с использованием GDB - PullRequest
0 голосов
/ 17 ноября 2018

Я пытался использовать gdb для отладки кода ассемблера, но получил сообщение об ошибке:

(gdb) run Starting program: /root/assembler_program/bsawp.o
/bin/bash: /root/assembler_program/bsawp.o: cannot execute binary file

код:

.section .text
.globl _start
_start:
nop
movl 0x12345678 ,  %ebx
bswap %ebx    
movl $1 , %eax
int $0x80

Тогда я использую GDB:

(gdb) break *_start+1
Breakpoint 1 at 0x400079
(gdb) run
Starting program: /root/assembler_program/bsawp

Breakpoint 1, 0x0000000000400079 in _start ()
(gdb) step
Single stepping until exit from function _start,
which has no line number information.

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400079 in _start ()

Не могли бы вы дать намек и предложение?

Спасибо! С наилучшими пожеланиями

1 Ответ

0 голосов
/ 17 ноября 2018

Здесь:

Starting program: /root/assembler_program/bsawp.o

вы пытаетесь запустить перемещаемый объектный файл. Не делай этого.

Вы должны сначала связать ваш объект с исполняемым файлом. Примерно так:

gcc -nostdlib -nostartfile test.s

Здесь:

Starting program: /root/assembler_program/bsawp

вы, очевидно, связали bsap.o с исполняемым файлом. Авария происходит здесь:

(gdb) x/i $pc
=> 0x400079 <_start+1>: mov    0x12345678,%ebx

Эта инструкция пытается загрузить значение с адреса 0x12345678 в регистр. Но этот адрес не указывает на правильную ячейку памяти.

Скорее всего, вы хотели, чтобы он загрузил константу 0x12345678, и в этом случае вам нужна инструкция:

movl $0x12345678, %ebx

С этим исправлением я получаю ожидаемое:

(gdb) run
Starting program: /tmp/a.out 
[Inferior 1 (process 238270) exited with code 022]
(gdb) p/x 022
$1 = 0x12
...