得到 Golang 程序的汇编代码的方法

得到 Golang 程序的汇编代码的方法

有多种方式可以获得Go程序的汇编代码, 尽管输出的格式有些不同,但是都是方便阅读的汇编代码,可以帮助我们更好的了解程序的底层运行方式。

方法一: go tool compile

使用go tool compile -N -l -S once.go生成汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
➜  awesomeProject go tool compile -N -l -S main.go
"".main STEXT size=165 args=0x0 locals=0x58
0x0000 00000 (main.go:22) TEXT "".main(SB), ABIInternal, $88-0
0x0000 00000 (main.go:22) MOVQ (TLS), CX
0x0009 00009 (main.go:22) CMPQ SP, 16(CX)
0x000d 00013 (main.go:22) JLS 155
0x0013 00019 (main.go:22) SUBQ $88, SP
0x0017 00023 (main.go:22) MOVQ BP, 80(SP)
0x001c 00028 (main.go:22) LEAQ 80(SP), BP
0x0021 00033 (main.go:22) FUNCDATA $0, gclocals·7d2d5fca80364273fb07d5820a76fef4(SB)
0x0021 00033 (main.go:22) FUNCDATA $1, gclocals·d2eb33d7ca216c70530f751d6fdafd01(SB)
0x0021 00033 (main.go:22) FUNCDATA $3, gclocals·9fb7f0986f647f17cb53dda1484e0f7a(SB)
0x0021 00033 (main.go:23) PCDATA $2, $1
0x0021 00033 (main.go:23) PCDATA $0, $0
0x0021 00033 (main.go:23) LEAQ ""..autotmp_2+24(SP), AX
0x0026 00038 (main.go:23) PCDATA $0, $1
0x0026 00038 (main.go:23) MOVQ AX, ""..autotmp_1+48(SP)
0x002b 00043 (main.go:23) PCDATA $2, $0
....

方法二: go tool objdump

首先先编译程序:go tool compile -N -l once.go,

使用go tool objdump once.o反汇编出代码 (或者使用go tool objdump -s Do once.o反汇编特定的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
➜  awesomeProject go tool compile -N -l main.go
➜ awesomeProject go tool objdump main.o
TEXT %22%22.main(SB) gofile../Users/zhubowen/golangProjects/awesomeProject/main.go
main.go:22 0x4cf 65488b0c2500000000 MOVQ GS:0, CX [5:9]R_TLS_LE
main.go:22 0x4d8 483b6110 CMPQ 0x10(CX), SP
main.go:22 0x4dc 0f8688000000 JBE 0x56a
main.go:22 0x4e2 4883ec58 SUBQ $0x58, SP
main.go:22 0x4e6 48896c2450 MOVQ BP, 0x50(SP)
main.go:22 0x4eb 488d6c2450 LEAQ 0x50(SP), BP
main.go:23 0x4f0 488d442418 LEAQ 0x18(SP), AX
main.go:23 0x4f5 4889442430 MOVQ AX, 0x30(SP)
main.go:23 0x4fa 8400 TESTB AL, 0(AX)
main.go:23 0x4fc 488b0500000000 MOVQ 0(IP), AX [3:7]R_PCREL:%22%22.statictmp
_0
main.go:23 0x503 4889442418 MOVQ AX, 0x18(SP)
main.go:23 0x508 0f100500000000 MOVUPS 0(IP), X0 [3:7]R_PCREL:%22%22.statictmp
_0+8
main.go:23 0x50f 0f11442420 MOVUPS X0, 0x20(SP)
main.go:23 0x514 488b442430 MOVQ 0x30(SP), AX
....

方法三: go build -gcflags -S

使用go build -gcflags -S once.go也可以得到汇编代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
➜  awesomeProject go build -gcflags -S  main.go
# command-line-arguments
"".main STEXT size=112 args=0x0 locals=0x38
0x0000 00000 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) TEXT "".main(SB), ABIInternal, $56-0
0x0000 00000 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) MOVQ (TLS), CX
0x0009 00009 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) CMPQ SP, 16(CX)
0x000d 00013 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) JLS 105
0x000f 00015 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) SUBQ $56, SP
0x0013 00019 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) MOVQ BP, 48(SP)
0x0018 00024 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) LEAQ 48(SP), BP
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) FUNCDATA $0, gclocals·33cdeccccebe8032
9f1fdbee7f5874cb(SB)
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) FUNCDATA $1, gclocals·33cdeccccebe8032
9f1fdbee7f5874cb(SB)
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:22) FUNCDATA $3, gclocals·9fb7f0986f647f17
cb53dda1484e0f7a(SB)
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) PCDATA $2, $0
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) PCDATA $0, $0
0x001d 00029 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) MOVQ "".statictmp_0(SB), AX
0x0024 00036 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) MOVQ AX, ""..autotmp_2+24(SP)
0x0029 00041 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) MOVUPS "".statictmp_0+8(SB), X0
0x0030 00048 (/Users/zhubowen/golangProjects/awesomeProject/main.go:23) MOVUPS X0, ""..autotmp_2+32(SP)
0x0035 00053 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) CALL runtime.printlock(SB)
0x003a 00058 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) PCDATA $2, $1
0x003a 00058 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) LEAQ ""..autotmp_2+24(SP), AX
0x003f 00063 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) PCDATA $2, $0
0x003f 00063 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) MOVQ AX, (SP)
0x0043 00067 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) MOVQ $3, 8(SP)
0x004c 00076 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) MOVQ $3, 16(SP)
0x0055 00085 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) CALL runtime.printslice(SB)
0x005a 00090 (/Users/zhubowen/golangProjects/awesomeProject/main.go:24) CALL runtime.printunlock(SB)
0x005f 00095 (/Users/zhubowen/golangProjects/awesomeProject/main.go:25) MOVQ 48(SP), BP
0x0064 00100 (/Users/zhubowen/golangProjects/awesomeProject/main.go:25) ADDQ $56, SP
....

总结

  • go tool compilego build -gcflags -S生成的是过程中的汇编。
  • 最终的机器码的汇编可以通过go tool objdump生成。
#

评论

`
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×