go tool compileの使い方
少し試したものの、忘れそうなのでメモ書きとして残します。
サンプルコード
package main import "fmt" func main() { fmt.Println("hello world") }
オブジェクトファイルの生成
-Sが1つだと標準出力のみです。2つだと.oファイルが生成されます。
$ go tool compile -S -S main.go
"".main STEXT size=120 args=0x0 locals=0x48
0x0000 00000 (main.go:5) TEXT "".main(SB), $72-0
(中略)
0x0000 65 48 8b 0c 25 00 00 00 00 48 3b 61 10 76 62 48 eH..%....H;a.vbH
0x0010 83 ec 48 48 89 6c 24 40 48 8d 6c 24 40 48 c7 44 ..HH.l$@H.l$@H.D
0x0020 24 30 00 00 00 00 48 c7 44 24 38 00 00 00 00 48 $0....H.D$8....H
0x0030 8d 05 00 00 00 00 48 89 44 24 30 48 8d 05 00 00 ......H.D$0H....
0x0040 00 00 48 89 44 24 38 48 8d 44 24 30 48 89 04 24 ..H.D$8H.D$0H..$
0x0050 48 c7 44 24 08 01 00 00 00 48 c7 44 24 10 01 00 H.D$.....H.D$...
0x0060 00 00 e8 00 00 00 00 48 8b 6c 24 40 48 83 c4 48 .......H.l$@H..H
0x0070 c3 e8 00 00 00 00 eb 88 ........
rel 5+4 t=16 TLS+0
rel 50+4 t=15 type.string+0
rel 62+4 t=15 "".statictmp_0+0
rel 99+4 t=8 fmt.Println+0
rel 114+4 t=8 runtime.morestack_noctxt+0
(中略)
type..importpath.fmt. SRODATA dupok size=6
0x0000 00 00 03 66 6d 74 ...fmt
gclocals·69c1753bd5f81501d95132d08af04464 SRODATA dupok size=8
0x0000 02 00 00 00 00 00 00 00 ........
gclocals·e226d4ae4a7cad8835311c6a4683c14f SRODATA dupok size=10
0x0000 02 00 00 00 02 00 00 00 00 03 ..........
gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8
0x0000 01 00 00 00 00 00 00 00 ........
オブジェクトファイルから実行コードを生成
$ go tool link main.o $ ls a.out main.go main.o $ ./a.out hello world
オブジェクトファイルに定義されているシンボルの表示
$ go tool nm main.o
U
44c T %22%22.init
517 B %22%22.initdone·
3b5 T %22%22.main
507 R %22%22.statictmp_0
U fmt.Println
U fmt.init
6de R gclocals·33cdeccccebe80329f1fdbee7f5874cb
6cc R gclocals·69c1753bd5f81501d95132d08af04464
6d4 R gclocals·e226d4ae4a7cad8835311c6a4683c14f
4ea ? go.info.%22%22.init
4cd ? go.info.%22%22.main
507 ? go.range.%22%22.init
4ea ? go.range.%22%22.main
4c2 R go.string."hello world"
U runtime.algarray
517 R runtime.gcbits.01
560 R runtime.gcbits.03
U runtime.morestack_noctxt
U runtime.throwinit
646 R type.*[1]interface {}
5c3 R type.*[]interface {}
528 R type.*interface {}
6c6 R type..importpath.fmt.
633 R type..namedata.*[1]interface {}-
5b1 R type..namedata.*[]interface {}-
518 R type..namedata.*interface {}-
67e R type.[1]interface {}
5fb R type.[]interface {}
561 R type.interface {}
U type.string
実行コードの逆アセンブリ
$ go tool objdump a.out (略)