Skip to content

Commit

Permalink
cmd/go: fix spurious rebuild of binaries using cgo on OS X
Browse files Browse the repository at this point in the history
The text segment starts farther into the binary when using
external linking on the mac. Test and fix.

Fixes golang#12173.

Change-Id: I1f0c81814bf70cd9decfceac3022784f4608eeef
Reviewed-on: https://go-review.googlesource.com/13672
Reviewed-by: Ian Lance Taylor <[email protected]>
Reviewed-by: Rob Pike <[email protected]>
Run-TryBot: Russ Cox <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
  • Loading branch information
rsc committed Aug 18, 2015
1 parent 3f01621 commit d2cf46d
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 4 deletions.
17 changes: 17 additions & 0 deletions src/cmd/go/note_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package main_test

import (
"cmd/go"
"runtime"
"testing"
)

Expand All @@ -22,4 +23,20 @@ func TestNoteReading(t *testing.T) {
if id != buildID {
t.Fatalf("buildID in hello binary = %q, want %q", id, buildID)
}

switch runtime.GOOS {
case "plan9":
// no external linking
t.Logf("no external linking - skipping linkmode=external test")

default:
tg.run("build", "-ldflags", "-buildid="+buildID+" -linkmode=external", "-o", tg.path("hello.exe"), tg.path("hello.go"))
id, err := main.ReadBuildIDFromBinary(tg.path("hello.exe"))
if err != nil {
t.Fatalf("reading build ID from hello binary (linkmode=external): %v", err)
}
if id != buildID {
t.Fatalf("buildID in hello binary = %q, want %q (linkmode=external)", id, buildID)
}
}
}
8 changes: 4 additions & 4 deletions src/cmd/go/pkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -1796,26 +1796,26 @@ func ReadBuildIDFromBinary(filename string) (id string, err error) {
return "", &os.PathError{Op: "parse", Path: filename, Err: errBuildIDUnknown}
}

// Read the first 8 kB of the binary file.
// Read the first 16 kB of the binary file.
// That should be enough to find the build ID.
// In ELF files, the build ID is in the leading headers,
// which are typically less than 4 kB, not to mention 8 kB.
// which are typically less than 4 kB, not to mention 16 kB.
// On other systems, we're trying to read enough that
// we get the beginning of the text segment in the read.
// The offset where the text segment begins in a hello
// world compiled for each different object format today:
//
// Plan 9: 0x20
// Windows: 0x600
// Mach-O: 0x1000
// Mach-O: 0x2000
//
f, err := os.Open(filename)
if err != nil {
return "", err
}
defer f.Close()

data := make([]byte, 8192)
data := make([]byte, 16*1024)
_, err = io.ReadFull(f, data)
if err == io.ErrUnexpectedEOF {
err = nil
Expand Down

0 comments on commit d2cf46d

Please sign in to comment.