Gcc

從 objdump 獲取僅十六進制的輸出

  • February 3, 2018

比如說我有這個 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 等)來獲得所需的輸出?

您可以使用以下方法提取文本段中的字節值:

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

-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

引用自:https://unix.stackexchange.com/questions/421556