Linux 유틸리티 objdump를 사용하여 여러 기능을 분해하는 방법은 무엇입니까?

Linux 유틸리티 objdump를 사용하여 여러 기능을 분해하는 방법은 무엇입니까?

프로그램이 바이너리 파일을 컴파일하고 생성한 후에는 objdump바이너리 파일의 디스어셈블리를 사용하여 어셈블리 코드와 많은 양의 정보를 추출할 수 있습니다.

그러나 -j .textwith 를 사용 objdump하면 내가 원하지 않는 전체 기능(glibc, OS 기능 등...)이 디스어셈블됩니다.

나는 바이너리 내에서 내 자신의 기능에만 집중하고 싶습니다. nm사용자 정의 함수만 찾는 데 사용합니다 . 이러한 함수의 이름을 추출한 후 함수를 분해하고 싶습니다. 하지만 objdump이를 생성한 허그 덤프 파일을 검색하여 내 기능과 관련된 디스어셈블리 코드를 추출하고 싶지 않습니다 .

basicmath프로그램의 바이너리 파일이 있다고 가정합니다.미벤치 벤치마크.

nm프로그램의 소스 코드에 정의된 함수만 찾는 데 사용합니다 .

아래 명령은 내가 원하는 기능(사용자 정의 기능)을 표시합니다.

nm -P tst.o | awk '$2 == "T" && $1 != "main" {print "b " $1}'

결과는 ( basicmath프로그램을 고려하여)

b deg2rad
b rad2deg
b solveCubic
b usqrt

이제 objdump에게 이러한 함수를 분해하고 결과를 단일 파일에 쓰도록 지시하는 방법이 필요합니다.

답변1

특정 기능으로 분해를 제한하도록 binutils 또는 elfutils의 objdump 프로그램에 지시하는 방법을 찾지 못했습니다. 그러나 몇 가지 해결 방법이 있습니다.

우리가 관심 있는 함수 목록이 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
...

관련 정보