diff options
| author | Cherry Mui <cherryyz@google.com> | 2024-10-08 17:46:22 -0400 |
|---|---|---|
| committer | Cherry Mui <cherryyz@google.com> | 2024-10-21 17:56:51 +0000 |
| commit | 00034fa796ed7d47895601ee5d7fef30dbd4c65c (patch) | |
| tree | cf513ae71d6fe69ad01696dc6d5a2471140b83e1 /src | |
| parent | c15e589733c7862f58542c9f526bf7bb8881636d (diff) | |
| download | go-00034fa796ed7d47895601ee5d7fef30dbd4c65c.tar.xz | |
cmd/internal/buildid: skip over GNU build ID from buildid computation
This is similar to CL 618597, but for GNU build ID on ELF. This
makes it possible to enable "-B gobuildid" by default on ELF.
Updates #41004.
For #63934.
Change-Id: I4e663a27a2f7824bce994c783fe6d9ce8d1a395a
Reviewed-on: https://go-review.googlesource.com/c/go/+/618600
Reviewed-by: Than McIntosh <thanm@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/internal/buildid/rewrite.go | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/cmd/internal/buildid/rewrite.go b/src/cmd/internal/buildid/rewrite.go index 26720afef4..5300f7f9b8 100644 --- a/src/cmd/internal/buildid/rewrite.go +++ b/src/cmd/internal/buildid/rewrite.go @@ -9,6 +9,7 @@ import ( "cmd/internal/codesign" imacho "cmd/internal/macho" "crypto/sha256" + "debug/elf" "debug/macho" "fmt" "io" @@ -185,14 +186,26 @@ func findHostBuildID(r io.Reader) (offset int64, size int64, ok bool) { if !ok { return 0, 0, false } - // TODO: handle ELF GNU build ID. - f, err := macho.NewFile(ra) + + ef, err := elf.NewFile(ra) + if err == nil { + // ELF file. Find GNU build ID section. + sect := ef.Section(".note.gnu.build-id") + if sect == nil { + return 0, 0, false + } + // Skip over the 3-word note "header" and "GNU\x00". + return int64(sect.Offset + 16), int64(sect.Size - 16), true + } + + mf, err := macho.NewFile(ra) if err != nil { return 0, 0, false } - reader := imacho.NewLoadCmdReader(io.NewSectionReader(ra, 0, 1<<63-1), f.ByteOrder, imacho.FileHeaderSize(f)) - for i := uint32(0); i < f.Ncmd; i++ { + // Mach-O file. Find LC_UUID load command. + reader := imacho.NewLoadCmdReader(io.NewSectionReader(ra, 0, 1<<63-1), mf.ByteOrder, imacho.FileHeaderSize(mf)) + for i := uint32(0); i < mf.Ncmd; i++ { cmd, err := reader.Next() if err != nil { break |
