从 objdump 获取仅十六进制输出

MD *_* XF 5 c gcc dynamic-linking hexdump hex

比如说我有这个 C 函数:

void f(int *x, int *y)
{
    (*x) = (*x) * (*y);
}
Run Code Online (Sandbox Code Playgroud)

保存到 时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  
Run Code Online (Sandbox Code Playgroud)

我希望它输出更像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

即,只是函数的十六进制值。是否有一些objdump标志可以做到这一点?否则,我可以使用哪些工具(例如 awk、sed、cut 等)来获得所需的输出?

ImH*_*ere 9

您可以使用以下命令提取文本段中的字节值:

$ objcopy -O binary -j .text f.o fo
Run Code Online (Sandbox Code Playgroud)

-O 二进制选项:

objcopy 可用于通过使用二进制的输出目标(例如,使用 -O 二进制)来生成原始二进制文件。当 objcopy 生成原始二进制文件时,它本质上会生成输入目标文件内容的内存转储。所有符号和重定位信息都将被丢弃。内存转储将从复制到输出文件的最低部分的加载地址开始。

-j .text选项:

-j sectionpattern
--only-section=sectionpattern
仅将指定的部分从输入文件复制到输出文件。可以多次给出此选项。
请注意,不恰当地使用此选项可能会使输出文件无法使用。sectionpattern 中接受通配符。

最终结果是一个文件 ( fo),其中只有.text部分的二进制值,即没有符号或重定位信息的可执行代码。

然后打印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
Run Code Online (Sandbox Code Playgroud)