프로그램이 바이너리 파일을 컴파일하고 생성한 후에는 objdump
바이너리 파일의 디스어셈블리를 사용하여 어셈블리 코드와 많은 양의 정보를 추출할 수 있습니다.
그러나 -j .text
with 를 사용 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
...
- 사용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
...