What:
$ go help build
...
-trimpath
remove all file system paths from the resulting executable.
Instead of absolute file system paths, the recorded file names
will begin either a module path@version (when using modules),
or a plain import path (when using the standard library, or GOPATH).
也就是說棚亩,在編譯產(chǎn)物中將不會使用文件的絕對路徑蓖议,而是使用module、go或者GOPATH讥蟆。
Why:
添加-trimpath
的收益:
- 減少二進(jìn)制的size(實測影響微乎其微)
- 去除編譯系統(tǒng)環(huán)境信息(目錄)的變化對標(biāo)識符的判斷的影響
- 減少程序日志的size和日志系統(tǒng)的存儲占用
影響:
- 影響debug勒虾,展示沒有找到方法解決,大家有的話還請不吝賜教瘸彤!
$ dlv1.22.1 exec ./testtrimpath Type 'help' for list of commands. (dlv) b main.main Breakpoint 1 set at 0x494e8e for main.main() jidudev.com/tech/infra/log-service/cmd/test.go:8 (dlv) c 0x494e8e) Warning: debugging optimized function
How:
$ go build -trimpath -o xxx .
Validation:
驗證方法有很多種修然,這里選擇的是查看二進(jìn)制的符號所在的文件信息,來判斷是否消除了前綴钧栖。
其他方法可以嘗試:
- 運行中獲取堆棧信息低零,來check堆棧中代碼對應(yīng)的文件位置
- 如果有些log庫已經(jīng)實現(xiàn)了打印文件路徑,可以直接打印日志查看
- 制造panic場景拯杠,通過堆棧中的文件路徑信息進(jìn)行驗證
測試用代碼(test.go
):
package main
import (
"math"
"github.com/google/uuid"
)
func main() {
println(math.Max(1, 2))
println(uuid.New().String())
}
直接編譯:
為了防止編譯器內(nèi)聯(lián)影響大家理解掏婶,這里統(tǒng)一禁用了內(nèi)聯(lián):
$ go build -gcflags="-l" -o test test.go
$ go tool objdump -s '^math.Max' test | head -2
TEXT math.Max(SB) /root/go/go1.22.1/src/math/dim.go
dim.go:40 0x46a440 493b6610 CMPQ SP, 0x10(R14)
$ go tool objdump -s '^github.com/google/uuid.New$' test | head -2
TEXT github.com/google/uuid.New(SB) /root/project/go/pkg/mod/github.com/google/uuid@v1.3.1/version4.go
version4.go:13 0x494a80 493b6610 CMPQ SP, 0x10(R14)
應(yīng)用-trimpath
flag進(jìn)行編譯:
$ go build -gcflags="-l" -trimpath -o testtrimpath test.go
$ go tool objdump -s '^math.Max' testtrimpath | head -2
TEXT math.Max(SB) math/dim.go
dim.go:40 0x46a440 493b6610 CMPQ SP, 0x10(R14)
$ go tool objdump -s '^github.com/google/uuid.New$' testtrimpath | head -2
TEXT github.com/google/uuid.New(SB) github.com/google/uuid@v1.3.1/version4.go
version4.go:13 0x494a80 493b6610 CMPQ SP, 0x10(R14)
相比于直接編譯的產(chǎn)物中,標(biāo)準(zhǔn)庫的符號潭陪,去掉了絕對路徑前綴:/root/go/go1.22.1/src/
雄妥;
對于第三發(fā)module依賴,其符號刪減了module緩存文件路徑前綴:/root/project/go/pkg/mod/
依溯。
編譯產(chǎn)物size:
-rwxr-xr-x 1 root root 2191633 Aug 3 10:57 test
-rwxr-xr-x 1 root root 2186769 Aug 3 10:58 testtrimpath
共減少:4864字節(jié)(可以忽略不計)