比如说我有这个 C 函数:
void f(int *x, int *y)
{
(*x) = (*x) * (*y);
}
保存到时f.c
,编译时gcc -c f.c
产生f.o
. objdump -d f.o
给出了这个:
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
我希望它输出更像这样的东西:
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
即,只是函数的十六进制值。有一些objdump
标志可以做到这一点吗?否则,我可以使用哪些工具(例如 awk、sed、cut 等)来获得所需的输出?
您可以使用以下方法提取文本段中的字节值:
-O 二进制选项:
-j .text
选项:最终结果是一个文件 (
fo
),其中只有.text
部分的二进制值,即没有符号或重定位信息的可执行代码。然后打印文件的十六进制值
fo
:怎么样
在这种情况下,将返回
另一种选择是使用
readelf
:使用一些特定的 .elf 文件,
objdump
并且objcopy
由于未知原因(可能是特定的拱门不兼容)而丢失,并且readelf
是我能找到的唯一可行的解决方案。