aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2024-10-08 17:46:22 -0400
committerCherry Mui <cherryyz@google.com>2024-10-21 17:56:51 +0000
commit00034fa796ed7d47895601ee5d7fef30dbd4c65c (patch)
treecf513ae71d6fe69ad01696dc6d5a2471140b83e1 /src/cmd/internal
parentc15e589733c7862f58542c9f526bf7bb8881636d (diff)
downloadgo-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/cmd/internal')
-rw-r--r--src/cmd/internal/buildid/rewrite.go21
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