var errBuildIDMalformed … var bangArch … var pkgdef … var goobject … var buildid … // ReadFile reads the build ID from an archive or executable file. func ReadFile(name string) (id string, err error) { … } // readGccgoArchive tries to parse the archive as a standard Unix // archive file, and fetch the build ID from the _buildid.o entry. // The _buildid.o entry is written by (*Builder).gccgoBuildIDELFFile // in cmd/go/internal/work/exec.go. func readGccgoArchive(name string, f *os.File) (string, error) { … } // readGccgoBigArchive tries to parse the archive as an AIX big // archive file, and fetch the build ID from the _buildid.o entry. // The _buildid.o entry is written by (*Builder).gccgoBuildIDXCOFFFile // in cmd/go/internal/work/exec.go. func readGccgoBigArchive(name string, f *os.File) (string, error) { … } var goBuildPrefix … var goBuildEnd … var elfPrefix … var machoPrefixes … var readSize … // readBinary reads the build ID from a binary. // // ELF binaries store the build ID in a proper PT_NOTE section. // // Other binary formats are not so flexible. For those, the linker // stores the build ID as non-instruction bytes at the very beginning // of the text segment, which should appear near the beginning // of the file. This is clumsy but fairly portable. Custom locations // can be added for other binary types as needed, like we did for ELF. func readBinary(name string, f *os.File) (id string, err error) { … } // readRaw finds the raw build ID stored in text segment data. func readRaw(name string, data []byte) (id string, err error) { … } // HashToString converts the hash h to a string to be recorded // in package archives and binaries as part of the build ID. // We use the first 120 bits of the hash (5 chunks of 24 bits each) and encode // it in base64, resulting in a 20-byte string. Because this is only used for // detecting the need to rebuild installed files (not for lookups // in the object file cache), 120 bits are sufficient to drive the // probability of a false "do not need to rebuild" decision to effectively zero. // We embed two different hashes in archives and four in binaries, // so cutting to 20 bytes is a significant savings when build IDs are displayed. // (20*4+3 = 83 bytes compared to 64*4+3 = 259 bytes for the // more straightforward option of printing the entire h in base64). func HashToString(h [32]byte) string { … }