-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/go: pass --build-id=none when generating a cgo .o
Some systems, like Ubuntu, pass --build-id when linking. The effect is to put a note in the output file. This is not useful when generating an object file with the -r option, as it eventually causes multiple build ID notes in the final executable, all but one of which are for tiny portions of the file and are therefore useless. Disable that by passing an explicit --build-id=none when linking with -r on systems that might do this. LGTM=bradfitz R=golang-codereviews, bradfitz CC=golang-codereviews https://golang.org/cl/119460043
- Loading branch information
1 parent
3d7e369
commit 7fdb029
Showing
3 changed files
with
97 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
// Copyright 2014 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package cgotest | ||
|
||
// Test that we have no more than one build ID. In the past we used | ||
// to generate a separate build ID for each package using cgo, and the | ||
// linker concatenated them all. We don't want that--we only want | ||
// one. | ||
|
||
import ( | ||
"bytes" | ||
"debug/elf" | ||
"os" | ||
"testing" | ||
) | ||
|
||
func testBuildID(t *testing.T) { | ||
f, err := elf.Open("/proc/self/exe") | ||
if err != nil { | ||
if os.IsNotExist(err) { | ||
t.Skip("no /proc/self/exe") | ||
} | ||
t.Fatalf("opening /proc/self/exe: ", err) | ||
} | ||
defer f.Close() | ||
|
||
c := 0 | ||
for i, s := range f.Sections { | ||
if s.Type != elf.SHT_NOTE { | ||
continue | ||
} | ||
|
||
d, err := s.Data() | ||
if err != nil { | ||
t.Logf("reading data of note section %d: %v", i, err) | ||
continue | ||
} | ||
|
||
for len(d) > 0 { | ||
|
||
// ELF standards differ as to the sizes in | ||
// note sections. Both the GNU linker and | ||
// gold always generate 32-bit sizes, so that | ||
// is what we assume here. | ||
|
||
if len(d) < 12 { | ||
t.Logf("note section %d too short (%d < 12)", i, len(d)) | ||
continue | ||
} | ||
|
||
namesz := f.ByteOrder.Uint32(d) | ||
descsz := f.ByteOrder.Uint32(d[4:]) | ||
typ := f.ByteOrder.Uint32(d[8:]) | ||
|
||
an := (namesz + 3) &^ 3 | ||
ad := (descsz + 3) &^ 3 | ||
|
||
if int(12+an+ad) > len(d) { | ||
t.Logf("note section %d too short for header (%d < 12 + align(%d,4) + align(%d,4))", i, len(d), namesz, descsz) | ||
continue | ||
} | ||
|
||
// 3 == NT_GNU_BUILD_ID | ||
if typ == 3 && namesz == 4 && bytes.Equal(d[12:16], []byte("GNU\000")) { | ||
c++ | ||
} | ||
|
||
d = d[12+an+ad:] | ||
} | ||
} | ||
|
||
if c > 1 { | ||
t.Errorf("found %d build ID notes", c) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters