Shell-Script

如何使用 Linux 實用程序 objdump 反彙編多個函式?

  • July 19, 2020

程序編譯生成二進製文件後,我們可以通過objdump反彙編二進製文件,提取出彙編程式碼和大量資訊。

但是,使用-j .textwith objdump,它將反彙編我不想要的整個函式(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
...
$ 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
...

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