goobuild 옵션을 조사해 봤어요.

18582 단어 Gobuildtech

개요

  • 최근 go를 쫓는 컴파일러
  • 평소 사용하지만 가끔 이런 경우가 있어서 조사해봤어요
  • 아직 전부는 아닌 것 같으니 나중에 다시 기재해야 한다
  • https://pkg.go.dev/cmd/go
  • 여기build에 옵션 일람
  • go build [-o output] [build flags] [packages]
    

    옵션


    -a: 강제 복구

  • cache를 사용하지 않고 모두 강제 재건
  • go build -a main.go
    

    -buildmode: 빌드 모드 지정

  • https://pkg.go.dev/cmd/go#hdr-Build_modes
  • static과shared로 나뉘었다고 생각하면 기본적으로 맞다
  • 구축할 대상 파일의 유형을 지정할 수 있습니다
  • archive
    비주 포장.a에서 구축
  • c-archive
  • c-archive에서 구축
  • 합병 대상.a 파일로 변경
  • http://menoie.cocolog-nifty.com/blog/2010/08/c-archive-files.html
  • c-shared
  • 공유 라이브러리 구축
  • cgo/export 주석만 사용하여 호출 가능한 기호의 함수 내보내기
  • default
  • 운영 패키지가 아닌 패키지를 실행 가능한 운영 패키지의 파일로 보냅니다.병합 a
  • shared
  • 목록의 비주 패키지를 공유 라이브러리에 통합
  • exe
  • 목록의 메인 패키지와 실행 가능한 파일을 가져오는 모든 내용을 구축
  • pie
  • PIE 형식으로 컴파일
  • 실행 파일 형식 중 하나
  • https://sugawarayusuke.hatenablog.com/entry/2018/01/22/025515
  • http://0xcc.net/blog/archives/000109.html
  • -ldflags: 링크 호출에서 전송할 로고 지정

  • 링크로 전달되는 플래그
  • 흔히 볼 수 있는 예로 gdb로 디버깅을 할 때
  • 여기 상세해
  • https://kazuhira-r.hatenablog.com/entry/2021/03/08/003752
  • -installsuffix: 설치 위치 지정

  • 기본값과 다른 곳에 설치하기 위한 지정
  • 대부분의 경우 $HOME 또는/usr/local/등에 설치
  • 이외의 곳에 설치하고 싶을 때 지정
  • gccgoflags: gccgo에 대한 로고

  • gccgo로 컴파일할 때 사용하는 표지
  • 후술한 goo에서 본가의 gc컴파일러를 제외하고
  • gcc에 gccgo라는 컴파일러가 존재한다
  • 그쪽 컴파일러에게 건네주는 로고
  • gc에 대한 로고

  • gc 컴파일러에 로고 넘기기
  • 모두가 알고 있는 억제와 Debug 최적화에 사용되는 표지
  • 자세한 내용은 tool comple-help에서 볼 수 있습니다
  • https://pkg.go.dev/cmd/compile
  • go tool compile -help
    

    -compiler: 컴파일러 지정

  • gccgo와 go
  • 가 있다
  • 기본적으로 go
  • 사용
  • gccgo는 gcc에 포함된 go의 컴파일러
  • gccgo
  • https://go.dev/doc/install/gccgo
  • -race: 추출 데이터 충돌

  • 추출 데이터 충돌
  • https://qiita.com/smith-30/items/be4d92c251d2b2b39bd3
  • https://qiita.com/po3rin/items/18a6621f39e9a6f6f7c4
  • 상술한 문장에 기재되어 있다
  • 충돌 검사를 위한 처리가 삽입되어 있기 때문
  • 실행하지 않으면 출력 오류 없음
  • 또한 성능에 영향을 미치기 때문에 정식 환경을 위한 건축물에서 사용해서는 안 된다
  • 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: 초기화되지 않은 메모리 감지

  • 스토리지 사용자와 상호 운용 가능
  • 초기화되지 않은 스토리지를 감지하는 데 사용되는 도구
  • https://msyksphinz.hatenablog.com/entry/2018/07/08/040000
  • memory sanitizer
  • https://tech.aptpod.co.jp/entry/2020/09/25/090000
  • https://mgoyoki.hatenablog.com/entry/2016/01/27/024327
  • 사용 방법은 다음과 같다.
  • https://stackoverflow.com/questions/63059865/how-do-i-run-go-test-with-the-msan-option-on-ubuntu-18-04
  • 샘플 체크

  • 사실상 선택의 여지가 없는 구축에서 성공했다
  • msn 옵션을 설정할 때 초기화되지 않은 변수를 참조하여 오류가 발생했습니다
  • 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에 사용할 임시 디렉터리 위치 보이기

  • build에 사용할 임시 디렉터리의 위치를 표시합니다
  • 그곳을 보자마자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 호출에 사용되는 매개 변수


  • 여기 보면 Trimpath 등
  • -asmflags=-trimpath=$GOPATH
    

    -x: 빌드에서 수행한 명령 표시

  • 빌드에서 실행되는 명령 표시
  • 이곳을 관찰할 때 GOROOT에 설치된 컴파일된 파일
  • 링크된 링크 발견
  • 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/
    

    좋은 웹페이지 즐겨찾기