goobuild 옵션을 조사해 봤어요.
개요
go build [-o output] [build flags] [packages]
옵션
-a: 강제 복구
go build -a main.go
-buildmode: 빌드 모드 지정
비주 포장.a에서 구축
-ldflags: 링크 호출에서 전송할 로고 지정
-installsuffix: 설치 위치 지정
gccgoflags: gccgo에 대한 로고
gc에 대한 로고
go tool compile -help
-compiler: 컴파일러 지정
-race: 추출 데이터 충돌
go build -race main.go
그래픽 체크 예
package main
import "context"
func main() {
ctx, cancel := context.WithCancel(context.Background())
var count int
go func() {
for i := 0; i < 10; i++ {
count++
}
cancel()
}()
go func() {
for i := 0; i < 10; i++ {
count++
}
cancel()
}()
select {
case <-ctx.Done():
return
}
}
$ go run main.go
go run -race main.go
==================
WARNING: DATA RACE
Read at 0x00c000124028 by goroutine 7:
main.main.func2()
/home/hiroyuki/tmp/mygobuild/main.go:16 +0x46
Previous write at 0x00c000124028 by goroutine 6:
main.main.func1()
/home/hiroyuki/tmp/mygobuild/main.go:10 +0x58
Goroutine 7 (running) created at:
main.main()
/home/hiroyuki/tmp/mygobuild/main.go:14 +0x1be
Goroutine 6 (finished) created at:
main.main()
/home/hiroyuki/tmp/mygobuild/main.go:8 +0x11c
==================
Found 1 data race(s)
exit status 66
- SMSAn: 초기화되지 않은 메모리 감지
샘플 체크
package main
import "fmt"
func main() {
var a int
fmt.Println(a)
}
go build -msan
# runtime/cgo
gcc: error: unrecognized argument to '-fsanitize=' option: 'memory'
-work:build에 사용할 임시 디렉터리 위치 보이기
$ go build -work main.go
WORK=/tmp/go-build3417807789
tree /tmp/go-build3417807789
/tmp/go-build3417807789
└── b001
├── _gomod_.go
├── _pkg_.a
├── exe
├── importcfg
└── importcfg.link
2 directories, 4 files
-asmflags: asm 호출에 사용되는 매개 변수
-asmflags=-trimpath=$GOPATH
-x: 빌드에서 수행한 명령 표시
go build -x main.go
WORK=/var/folders/kr/4zffqydx6k1453qkpkmtcml00000gn/T/go-build778683197
mkdir -p $WORK/b001/
cat >$WORK/b001/_gomod_.go << 'EOF' # internal
package main
import _ "unsafe"
//go:linkname __debug_modinfo__ runtime.modinfo
var __debug_modinfo__ = "0w\xaf\f\x92t\b\x02A\xe1\xc1\a\xe6\xd6\x18\xe6path\tcommand-line-arguments\nmod\tcommand-line-arguments\t(devel)\t\n\xf92C1\x86\x18 r\x00\x82B\x10A\x16\xd8\xf2"
EOF
cat >$WORK/b001/importcfg << 'EOF' # internal
# import config
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
EOF
cd /Users/amesho/tmp/compildedebug
/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p main -lang=go1.17 -complete -buildid 5BSOkrLpMKVTefZlhNku/5BSOkrLpMKVTefZlhNku -goversion go1.17.7 -D _/Users/amesho/tmp/compildedebug -importcfg $WORK/b001/importcfg -pack -c=4 ./main.go $WORK/b001/_gomod_.go
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cp $WORK/b001/_pkg_.a /Users/amesho/Library/Caches/go-build/2b/2b93eec6dcd1dea0c47d03c757b3b85fda9da04427527fa5995543181bc817e4-d # internal
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=$WORK/b001/_pkg_.a
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile internal/fmtsort=/usr/local/go/pkg/darwin_amd64/internal/fmtsort.a
packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
packagefile math=/usr/local/go/pkg/darwin_amd64/math.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile reflect=/usr/local/go/pkg/darwin_amd64/reflect.a
packagefile strconv=/usr/local/go/pkg/darwin_amd64/strconv.a
packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
packagefile unicode/utf8=/usr/local/go/pkg/darwin_amd64/unicode/utf8.a
packagefile internal/abi=/usr/local/go/pkg/darwin_amd64/internal/abi.a
packagefile internal/bytealg=/usr/local/go/pkg/darwin_amd64/internal/bytealg.a
packagefile internal/cpu=/usr/local/go/pkg/darwin_amd64/internal/cpu.a
packagefile internal/goexperiment=/usr/local/go/pkg/darwin_amd64/internal/goexperiment.a
packagefile runtime/internal/atomic=/usr/local/go/pkg/darwin_amd64/runtime/internal/atomic.a
packagefile runtime/internal/math=/usr/local/go/pkg/darwin_amd64/runtime/internal/math.a
packagefile runtime/internal/sys=/usr/local/go/pkg/darwin_amd64/runtime/internal/sys.a
packagefile internal/reflectlite=/usr/local/go/pkg/darwin_amd64/internal/reflectlite.a
packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
packagefile math/bits=/usr/local/go/pkg/darwin_amd64/math/bits.a
packagefile internal/itoa=/usr/local/go/pkg/darwin_amd64/internal/itoa.a
packagefile internal/oserror=/usr/local/go/pkg/darwin_amd64/internal/oserror.a
packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
packagefile internal/syscall/execenv=/usr/local/go/pkg/darwin_amd64/internal/syscall/execenv.a
packagefile internal/syscall/unix=/usr/local/go/pkg/darwin_amd64/internal/syscall/unix.a
packagefile internal/testlog=/usr/local/go/pkg/darwin_amd64/internal/testlog.a
packagefile internal/unsafeheader=/usr/local/go/pkg/darwin_amd64/internal/unsafeheader.a
packagefile io/fs=/usr/local/go/pkg/darwin_amd64/io/fs.a
packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
packagefile time=/usr/local/go/pkg/darwin_amd64/time.a
packagefile unicode=/usr/local/go/pkg/darwin_amd64/unicode.a
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
packagefile path=/usr/local/go/pkg/darwin_amd64/path.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/a.out -importcfg $WORK/b001/importcfg.link -buildmode=exe -buildid=HPGTvia4hCV6Rsc9yJdV/5BSOkrLpMKVTefZlhNku/wflypVVZNnVC9uFBm6Ij/HPGTvia4hCV6Rsc9yJdV -extld=clang $WORK/b001/_pkg_.a
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/exe/a.out # internal
mv $WORK/b001/exe/a.out main
rm -r $WORK/b001/
Reference
이 문제에 관하여(goobuild 옵션을 조사해 봤어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/hiroyukim/articles/ccb937039e5747텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)