1. 程式人生 > >14章.golang 引導《GO語言學習筆記》

14章.golang 引導《GO語言學習筆記》

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.