go build -ldflags 參數及 gdb 調試
有時發布時我們想隱藏所有代碼實現相關的信息,使用 go build -ldflags 參數可以實現相關要求。
示例代碼
本文使用版本為go 1.6。
package main
import "log"
type MyCat struct {
name string
age int
}
func main() {
cat := MyCat{
name: "tom",
age: 10,
}
log.SetFlags(log.Llongfile)
log.Println(cat)
}
使用-ldflags
設置編譯參數-ldflags "-w -s"
。
其中-w
為去掉調試信息(無法使用gdb調試),-s
為去掉符號表(暫未清楚具體作用)。
go build -ldflags "-w -s" ./hello.go
-
運行觀察打印,看見文件名、行號等信息依然保留。
./hello
打印輸出如下。而且將該可執行文件置於任何目錄下執行,都顯示相同的輸出。
可見,文件名和行號為編譯時將當前的文件名和行號編譯進二進制文件中。/home/gv/hello.go:17: {tom 10}
-
使用LiteIDE查看二進制文件可以搜索到
MyCat
標識符。 -
使用gdb無法調試,可見調試信息已清除
gdb ./hello (gdb) l main.main No symbol table is loaded. Use the "file" command.
不使用-ldflags
go build ./hello.go
-
運行打印看見文件名、行號。
-
使用LiteIDE查看二進制文件可以搜索到
MyCat
標識符。上述都與使用 -ldflags 參數得到的結果相同。
-
使用gdb調試可列出源代碼,也可打斷點單步調試。
(gdb) l main.main 5 type MyCat struct { 6 name string 7 age int 8 } 9 10 func main() { 11 cat := MyCat{ 12 name: "tom", 13 age: 10, 14 }
-
將源文件刪除后再使用gdb調試,可打斷點單步調試,但無法列出源代碼,只能列出行號和文件名。
gdb ./hello (gdb) l main.main 5 /home/gv/hello.go: No such file or directory. in /home/gv/hello.go
可見,調試如需列出源代碼還需在其編譯時寫進的文件名和行號中查找。