14章.golang 引導《GO語言學習筆記》
阿新 • • 發佈:2018-12-15
1,編譯好的可執行檔案的執行入口不是main.main函式,因為編譯器會插入一段引導程式碼,完成諸如命令列引數,執行時初始化等工作,然後才會進入使用者邏輯
2,例項程式碼:
package main
import ("fmt")
func main(){
fmt.Println("hello world")
}
3,編譯,然後用GDB檢視:
go build -gcflags "-N -l" -o test test.go
4,使用gdb檢視 test 檔案,info files 檢視詳細資訊
gdb test
(gdb)info files
5,利用斷點檔案找到目標檔案資訊
(gdb) b*0x452060
Breakpoint 1 at 0x452060: file /usr/local/go/src/runtime/rt0_linux_amd64.s, line 8.
6,開啟rt0_linux_admin64.s 檢視第8行,結果如果,可以追溯到rt0_go(SB)
TEXT _rt0_amd64_linux(SB),NOSPLIT,$-8 8 LEAQ 8(SP), SI // argv 9 MOVQ 0(SP), DI // argc 10 MOVQ $main(SB), AX 11 JMP AX TEXT main(SB),NOSPLIT,$-8 73 MOVQ $runtime·rt0_go(SB), AX 74 JMP AX
7,用GDB設定斷點,檢視rt0_go所在位置
(gdb) b runtime.rt0_go
Breakpoint 2 at 0x44e850: file /usr/local/go/src/runtime/asm_amd64.s, line 12.
8,檢視asm_admin64.s內容
//呼叫初始化函式 CALL runtime·args(SB) CALL runtime·osinit(SB) CALL runtime·schedinit(SB) // create a new goroutine to start program MOVQ $runtime·mainPC(SB), AX // entry PUSHQ AX PUSHQ $0 // arg size CALL runtime·newproc(SB) POPQ AX POPQ AX // start this M CALL runtime·mstart(SB)
9,由組合語言針對特定平臺實現的引導過程全部完成,後續的內容基本上都是由go實現的。
(gdb) b runtime.main
Breakpoint 3 at 0x428810: file /usr/local/go/src/runtime/proc.go, line 106.