Comment on page
10.3 导出对象文件
将编译结果导出为对象文件是编译的最后一步,该文件是编译器的输出,链接器的输入。该逻辑在编译器主函数的尾部:
// file: cmd/compile/internal/gc/main.go
func Main() {
// 忽略之前代码
// 导出编译结果到磁盘
base.Timer.Start("be", "dumpobj")
dumpdata()
base.Ctxt.NumberSyms()
dumpobj()
if base.Flag.AsmHdr != "" {
dumpasmhdr()
}
}
可以通过编译参数
-o
指定导出的文件名,默认情况下与编译的文件名或包名一致。例如将下列内容保存为 main.go
:package main
func sum(i, j int) int {
return i + j
}
通过命令
go tool compile -G=3 main.go
得到编译输出文件 main.o
.对于编译得到的结果,可以通过命令
go tool objdump
查看,使用 go tool objdump main.o
可以得到如下结果:TEXT “”.sum(SB)main.go:4 0x2fa 488b442410 MOVQ 0x10(SP), AXmain.go:4 0x2ff 488b4c2408 MOVQ 0x8(SP), CXmain.go:4 0x304 4801c8 ADDQ CX, AXmain.go:4 0x307 4889442418 MOVQ AX, 0x18(SP)main.go:4 0x30c c3 RET