GDB: как разобрать неструктурированный кусок кода? - PullRequest
1 голос
/ 04 февраля 2020

Имея это в nasm:

section .data
cod: db '0123456789ABCDEF'

section .text
global _start
_start:
    nop
    mov rax, 0x1122334455667788
    mov rdi, 1
    mov rdx, 1
    mov rcx, 64

.loop:
    push rax
    sub rcx, 4
    sar rax, cl
    and rax, 0xf
    lea rsi, [cod + rax]
    mov rax, 1
    push rcx
    syscall
    pop rcx
    pop rax
    test rcx, rcx
    jnz .loop
    mov rax, 60
    xor rdi, rdi
    syscall

В in gdb: disas _start.loop дает: Attempt to extract a component of a value that is not a structure.

Как я могу отменить l oop в gdb?

PS: Я также хотел бы знать, что подразумевается в gdb как структура. Я полагаю, это не имеет ничего общего с c структурами, а скорее с функциональными фреймами? Таким образом, GDB может видеть, где функция запускается и как? Так что в моем случае это al oop, а не функция, поэтому он не имеет никаких кадров. Это означает ошибку?

РЕДАКТИРОВАТЬ: я попытался войти в GDB:

(gdb) break *_start+1
Breakpoint 1, 0x0000000000401001 in _start ()
(gdb) n
Single stepping until exit from function _start,
which has no line number information.

И затем выведите 1122334455667788[Inferior 1 (process 6257) exited normally]

НО, я не видел ни одного инструкция от <_start.loop> l oop, это просто выход из _start. Я не знаю, происходит ли это из-за директивы .loop nasm или у нее нет «поведения структуры», но как я могу увидеть кусок кода .loop в gdb перед выходом из _start?

...