[short] skip [!cgo] skip go build -o main.exe exec ./main.exe stdout 'DW_AT_comp_dir not contains GOROOT in binary' -- go.mod -- module compdir go 1.18 -- main.go -- package main import "C" import ( "debug/dwarf" "os" "path/filepath" "runtime" "strings" "log" "fmt" ) var _ C.int func main() { dwarfData, err := readDWARF(os.Args[0]) if err != nil { log.Fatal(err) } goroot := filepath.Join(runtime.GOROOT(), "src") dwarfReader := dwarfData.Reader() for { e, err := dwarfReader.Next() if err != nil { log.Fatal(err) } if e == nil { break } field := e.AttrField(dwarf.AttrCompDir) if field == nil { continue } compdir := field.Val.(string) if strings.HasPrefix(compdir, goroot) { fmt.Printf("DW_AT_comp_dir %q contains GOROOT in binary.", compdir) return } } fmt.Println("DW_AT_comp_dir not contains GOROOT in binary") } -- read_darwin.go -- package main import ( "debug/dwarf" "debug/macho" ) func readDWARF(exePath string) (*dwarf.Data, error) { machoFile, err := macho.Open(exePath) if err != nil { return nil, err } defer machoFile.Close() return machoFile.DWARF() } -- read_elf.go -- // +build android dragonfly freebsd illumos linux netbsd openbsd solaris package main import ( "debug/dwarf" "debug/elf" ) func readDWARF(exePath string) (*dwarf.Data, error) { elfFile, err := elf.Open(exePath) if err != nil { return nil, err } defer elfFile.Close() return elfFile.DWARF() } -- read_windows.go -- package main import ( "debug/dwarf" "debug/pe" ) func readDWARF(exePath string) (*dwarf.Data, error) { peFile, err := pe.Open(exePath) if err != nil { return nil, err } defer peFile.Close() return peFile.DWARF() }