Dica: Disassembler no GDB

Já falei pra vocês que prefiro a sintaxe da Intel ao invés da AT&T, para as listagens de códigos em assembly? O GDB, por default, usa a sintaxe da AT&T, mas basta usar o comando abaixo para mudar isso:

(gdb) set disassembly-flavor intel

O problema é que tenho que digitar essa linha toda vez que uso o GDB. Felizmente podemos executar comandos, automaticamente, quando iniciamos o GDB, através do arquivo de configuração ~/.gdbinit:

$ echo 'set disassembly-flavor intel' > ~/.gdbinit

Daí é só usar o comando disassemble (ou disas, para abreviar) para listar qualquer função ou breakpoint desejado. Mas, existem 3 listagens possíveis com o comando…

Usando o clássico programinha Hello, world, compilado com a chave -g do GCC:

/* test.c - compilar com 'gcc -O3 -g test.c -o test' */
#include <stdio.h>

int main(int argc, char *argv[])
{
  printf("Hello, world!\n");
  return 0;
}

A primeira listagem em assembly pode ficar mais ou menos assim:

$ gdb test
...
(gdb) disas main
Dump of assembler code for function main:
   0x0000000000400400 <+0>:     sub    rsp,0x8
   0x0000000000400404 <+4>:     mov    edi,0x4005cc
   0x0000000000400409 <+9>:     call   0x4003e0 <puts@plt>
   0x000000000040040e <+14>:    xor    eax,eax
   0x0000000000400410 <+16>:    add    rsp,0x8
   0x0000000000400414 <+20>:    ret
End of assembler dump.

A listagem nos dá o endereço (em hexadecimal) e o offset (em decimal) relativo ao início da função de cada instrução. Acredito que esse offset seja fornecido especialmente porque, na arquitetura x86-64, existe um modo de endereçamento que usa o registrador RIP.

O disassembler do GDB pode listar, também, o código fonte que gerou a listagem, se usarmos a opção /m. Também pode listar o código binário gerado, usando a opção /r. Mas, não é possível combinar as duas opções:

(gdb) disas /m main
Dump of assembler code for function main:
5	{
   0x0000000000400400 <+0>:     sub    rsp,0x8
6	  printf("Hello, world!\n");
   0x0000000000400404 <+4>:     mov    edi,0x4005cc
   0x0000000000400409 <+9>:     call   0x4003e0 <puts@plt>
7	  return 0;
8	}
   0x000000000040040e <+14>:    xor    eax,eax
   0x0000000000400410 <+16>:    add    rsp,0x8
   0x0000000000400414 <+20>:    ret
End of assembler dump.

(gdb) disas /r main
Dump of assembler code for function main:
   0x0000000000400400 <+0>:     48 83 ec 08     sub    rsp,0x8
   0x0000000000400404 <+4>:     bf cc 05 40 00  mov    edi,0x4005cc
   0x0000000000400409 <+9>:     e8 d2 ff ff ff  call   0x4003e0 <puts@plt>
   0x000000000040040e <+14>:    31 c0           xor    eax,eax
   0x0000000000400410 <+16>:    48 83 c4 08     add    rsp,0x8
   0x0000000000400414 <+20>:    c3              ret    
End of assembler dump.
Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s