Obtém saída somente hexadecimal do objdump

3

Digamos, por exemplo, que eu tenho essa função C:

void f(int *x, int *y)
{
    (*x) = (*x) * (*y);
}

Quando salvo em f.c , compilar com gcc -c f.c produz f.o . objdump -d f.o dá isto:

f.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 89 7d f8             mov    %rdi,-0x8(%rbp)
   8:   48 89 75 f0             mov    %rsi,-0x10(%rbp)
   c:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  10:   8b 10                   mov    (%rax),%edx
  12:   48 8b 45 f0             mov    -0x10(%rbp),%rax
  16:   8b 00                   mov    (%rax),%eax
  18:   0f af d0                imul   %eax,%edx
  1b:   48 8b 45 f8             mov    -0x8(%rbp),%rax
  1f:   89 10                   mov    %edx,(%rax)
  21:   5d                      pop    %rbp
  22:   c3                      retq  

Gostaria que saísse algo mais assim:

55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3

Ou seja, apenas os valores hexadecimais da função. Existe algum sinalizador objdump para fazer isso? Caso contrário, quais ferramentas posso usar (por exemplo, awk, sed, cut, etc) para obter essa saída desejada?

    
por MD XF 03.02.2018 / 01:30

2 respostas

5

Você pode extrair os valores de bytes no segmento de texto com:

$ objcopy -O binary -j .text f.o fo

A opção binária -O:

objcopy can be used to generate a raw binary file by using an output target of binary (e.g., use -O binary). When objcopy generates a raw binary file, it will essentially produce a memory dump of the contents of the input object file. All symbols and relocation information will be discarded. The memory dump will start at the load address of the lowest section copied into the output file.

A opção -j .text :

-j sectionpattern
--only-section=sectionpattern
Copy only the indicated sections from the input file to the output file. This option may be given more than once.
Note that using this option inappropriately may make the output file unusable. Wildcard characters are accepted in sectionpattern.

O resultado final é um arquivo ( fo ) com os valores binários de apenas a seção .text , que é o código executável sem símbolos ou informações de realocação.

E, em seguida, imprima os valores hexadecimais do arquivo fo :

$ od -An -t x1 fo
 55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8
 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89
 10 90 5d c3
    
por 03.02.2018 / 01:54
2

Que tal

awk '/^....:/{a=substr($0,9,20);sub(/ +$/,"",a);b=b" "a}END{print substr(b,2)}'

Nesse caso, retornaria

55 48 89 e5 48 89 7d f8 48 89 75 f0 48 8b 45 f8 8b 10 48 8b 45 f0 8b 00 0f af d0 48 8b 45 f8 89 10 5d c3
    
por 03.02.2018 / 01:44