Shell-Script
如何使用 Linux 實用程序 objdump 反彙編多個函式?
程序編譯生成二進製文件後,我們可以通過
objdump
反彙編二進製文件,提取出彙編程式碼和大量資訊。但是,使用
-j .text
withobjdump
,它將反彙編我不想要的整個函式(glibc、OS 函式等)。我只想關註二進製文件中我自己的函式。使用
nm
,可以只找到使用者定義的函式。提取這些函式的名稱後,我只想反彙編這些函式。但是,我不想在objdump
生成它的擁抱轉儲文件中搜尋並提取與我的函式相關的反彙編程式碼。假設我們有
basicmath
來自MiBench 基準程序的二進製文件。使用
nm
,可以只找到該程序原始碼中定義的函式。下面的命令將顯示我想要的功能(使用者定義的功能)
nm -P tst.o | awk '$2 == "T" && $1 != "main" {print "b " $1}'
結果將是(考慮
basicmath
程序)b deg2rad b rad2deg b solveCubic b usqrt
現在,我需要一種方法來告訴 objdump 僅反彙編這些函式並將結果寫入單個文件。
我看不到一種方法可以告訴 objdump 程序與 binutils 或 elfutils 來限制對特定功能的反彙編。不過,有幾個解決方法。
假設我們感興趣的函式列表在 file 中
list
:$ nm -P basicmath_small | awk '{ if ($2 == "T" && $1 != "main" && substr($1,1,1) != "_") print $1}' > list $ cat list deg2rad rad2deg SolveCubic usqrt
- 使用 awk 過濾來自 objdump 的大反彙編輸出。每個感興趣的區域都以一行開頭,
<functionname>:
並一直持續到一個空行(或文件結尾)。$ xargs < list | sed -e 's/^/<(/' -e 's/ /|/g' -e 's/$/)>:\$/' > rlist $ cat rlist <(deg2rad|rad2deg|SolveCubic|usqrt)>:$ $ objdump -d -j .text basicmath_small | awk -v rlist="$(cat rlist)" \ '{ if ($0 ~ rlist) doprint=1; if ($0 == "") doprint=0; if (doprint) print }' 0000000000400fc0 <rad2deg>: 400fc0: f2 0f 59 05 c8 4d 0a mulsd 0xa4dc8(%rip),%xmm0 # 4a5d90 <c2+0x10> 400fc7: 00 400fc8: f2 0f 5e 05 b8 4d 0a divsd 0xa4db8(%rip),%xmm0 # 4a5d88 <c2+0x8> 400fcf: 00 400fd0: c3 retq 400fd1: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 400fd6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 400fdd: 00 00 00 0000000000400fe0 <deg2rad>: 400fe0: f2 0f 59 05 a0 4d 0a mulsd 0xa4da0(%rip),%xmm0 # 4a5d88 <c2+0x8> 400fe7: 00 400fe8: f2 0f 5e 05 a0 4d 0a divsd 0xa4da0(%rip),%xmm0 # 4a5d90 <c2+0x10> 400fef: 00 400ff0: c3 retq 400ff1: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1) 400ff8: 00 00 00 400ffb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) 0000000000401000 <SolveCubic>: 401000: f2 0f 5e c8 divsd %xmm0,%xmm1 ...
- 使用Go 的 objdump,它有一個
-s regexp
選項$ xargs < list | sed -e 's/^/^(/' -e 's/ /|/g' -e 's/$/)\$/' > rlist $ cat rlist ^(deg2rad|rad2deg|SolveCubic|usqrt)$ $ go tool objdump -s "$(cat rlist)" basicmath_small TEXT rad2deg(SB) :0 0x400fc0 f20f5905c84d0a00 MULSD 0xa4dc8(IP), X0 :0 0x400fc8 f20f5e05b84d0a00 DIVSD 0xa4db8(IP), X0 :0 0x400fd0 c3 RET TEXT deg2rad(SB) :0 0x400fe0 f20f5905a04d0a00 MULSD 0xa4da0(IP), X0 :0 0x400fe8 f20f5e05a04d0a00 DIVSD 0xa4da0(IP), X0 :0 0x400ff0 c3 RET TEXT SolveCubic(SB) :0 0x401000 f20f5ec8 DIVSD X0, X1 ...