有多种方式可以获得Go程序的汇编代码, 尽管输出的格式有些不同,但是都是方便阅读的汇编代码,可以帮助我们更好的了解程序的底层运行方式。
我们看下面一段代码, 它是sync.Once
的实现,去掉了不必要的注释,复制出来用来研究的一段小代码。
|
|
方法一: go tool compile
使用go tool compile -N -l -S once.go
生成汇编代码:
|
|
方法二: go tool objdump
首先先编译程序: go tool compile -N -l once.go
,
使用go tool objdump once.o
反汇编出代码 (或者使用go tool objdump -s Do once.o
反汇编特定的函数:):
|
|
方法三: go build -gcflags -S
使用go build -gcflags -S once.go
也可以得到汇编代码:
|
|
go tool compile
和 go build -gcflags -S
生成的是过程中的汇编,和最终的机器码的汇编可以通过go tool objdump
生成。
参考文档
- https://www.reddit.com/r/golang/comments/6a5557/how_to_get_assembly_output_from_a_small_go_program/
- https://stackoverflow.com/questions/43858356/how-to-get-assembly-output-for-a-short-go-program
- https://rakyll.org/codegen/
- https://stackoverflow.com/questions/22769246/how-to-disassemble-one-single-function-using-objdump
- https://golang.org/cmd/objdump/
- https://golang.org/cmd/compile/
- https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies