Digamos, por exemplo, que eu tenha esta função C:
void f(int *x, int *y)
{
(*x) = (*x) * (*y);
}
Quando salvo em f.c
, a compilação com gcc -c f.c
produz f.o
. objdump -d f.o
dá isso:
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
Eu gostaria que produzisse algo mais parecido com isto:
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 alguma objdump
bandeira para fazer isso? Caso contrário, quais ferramentas posso usar (por exemplo, awk, sed, cut, etc) para obter a saída desejada?
Você pode extrair os valores de byte no segmento de texto com:
A opção binária -O:
A
-j .text
opção:O resultado final é um arquivo (
fo
) com os valores binários apenas da.text
seção, ou seja, o código executável sem símbolos ou informações de realocação.E então imprima os valores hexadecimais do
fo
arquivo:Que tal
Neste caso, retornaria
Outra opção é usar
readelf
:Com alguns arquivos .elf específicos,
objdump
eobjcopy
são perdidos por um motivo desconhecido (talvez uma incompatibilidade de arco específica) ereadelf
é a única solução funcional que pude encontrar.