「Go/Goのプログラムがどんなアセンブリにコンパイルされるか?」の版間の差分
削除された内容 追加された内容
init. タグ: 2017年版ソースエディター |
→Goのプログラムがどんなアセンブリにコンパイルされるか?: go tool compie でオブジェクトファイルをカレントディレクトリーに生成するようにした。 タグ: 2017年版ソースエディター |
||
18 行
:<syntaxhighlight lang=shell>
% go
</syntaxhighlight>
: <code>hello.o</code>にコンパイル結果が出力されますが、これは。
:<syntaxhighlight lang=shell>
% file fibo.o
fibo.o: current ar archive
</syntaxhighlight>
:<syntaxhighlight lang=shell>
% ar tv hello.o
% go tool objdump -S /var/tmp/go-build4052974754/b001/_pkg_.a > main.objdump▼
rw-r--r-- 0/0 92 Jan 1 09:00 1970 __.PKGDEF
rw-r--r-- 0/0 6447 Jan 1 09:00 1970 _go_.o
</syntaxhighlight>
展開してみても
: go tool objdump は Go の逆アセンブラーで -S はソースも併せて表示するオプションです▼
% ar xv hello.o
x - __.PKGDEF
x - _go_.o
% file __.PKGDEF _go_.o
0x194e 7656 JBE 0x19a6▼
__.PKGDEF: data
0x1950 4883ec40 SUBQ $0x40, SP▼
_go_.o: data
0x1954 48896c2438 MOVQ BP, 0x38(SP)▼
</syntaxhighlight>
0x1959 488d6c2438 LEAQ 0x38(SP), BP▼
:と、素性はわかりませんが
0x195e 440f117c2428 MOVUPS X15, 0x28(SP)▼
:<syntaxhighlight lang=shell>
0x1964 488d1500000000 LEAQ 0(IP), DX [3:7]R_PCREL:type.string▼
0x196b 4889542428 MOVQ DX, 0x28(SP)▼
</syntaxhighlight>
0x1970 488d1500000000 LEAQ 0(IP), DX [3:7]R_PCREL:main..stmp_0<1>▼
;hello.objdump:<syntaxhighlight lang=c-objdump>
0x1977 4889542430 MOVQ DX, 0x30(SP)▼
return Fprintln(os.Stdout, a...)
0x14f8 48c744241801000000 MOVQ $0x1, 0x18(SP)
0x1501 48c744242001000000 MOVQ $0x1, 0x20(SP)
}
func main() {
0x19af eb99 JMP main.main(SB)▼
TEXT
▲ 0x19b1 c3 RET
0x16f5 e900000000 JMP 0x16fa [1:5]R_CALL:os.(*file).close
</syntaxhighlight>
: ターゲットは AMD64 なのですが、あまり見慣れないニーモニックだと思います。
73 ⟶ 83行目:
: 演算や転送の幅は SUB'''Q''' や MOV'''L''' のようにオペレーションの末尾の文字で指定されます。
よく見ると、ソースの
Goはコンパイラーですが、コンパイラー自身もGoで書かれソースコードを含んで配布されており、他にも
go tool nm
や
go tool pack
の様なハウスキーピング用のコマンドがあります(機会を見て紹介します)。
{{Nav}}
== 脚註 ==
<references />
|