Gcc
從 objdump 獲取僅十六進制的輸出
比如說我有這個 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