1
0
mirror of https://github.com/golang/go synced 2024-11-27 01:21:18 -07:00

cmd/nm: print symbol sizes for windows pe executables

Fixes #6973

LGTM=r
R=golang-codereviews, r
CC=golang-codereviews
https://golang.org/cl/88820043
This commit is contained in:
Alex Brainman 2014-04-19 14:47:20 +10:00
parent 7c7aaa4156
commit 6e8c7f5bb2
3 changed files with 19 additions and 5 deletions

View File

@ -9,6 +9,7 @@ package main
import (
"debug/pe"
"os"
"sort"
)
func peSymbols(f *os.File) []Sym {
@ -18,6 +19,10 @@ func peSymbols(f *os.File) []Sym {
return nil
}
// Build sorted list of addresses of all symbols.
// We infer the size of a symbol by looking at where the next symbol begins.
var addrs []uint64
var imageBase uint64
switch oh := p.OptionalHeader.(type) {
case *pe.OptionalHeader32:
@ -78,6 +83,15 @@ func peSymbols(f *os.File) []Sym {
sym.Addr += imageBase + uint64(sect.VirtualAddress)
}
syms = append(syms, sym)
addrs = append(addrs, sym.Addr)
}
sort.Sort(uint64s(addrs))
for i := range syms {
j := sort.Search(len(addrs), func(x int) bool { return addrs[x] > syms[i].Addr })
if j < len(addrs) {
syms[i].Size = int64(addrs[j] - syms[i].Addr)
}
}
return syms

View File

@ -8,9 +8,13 @@ enum {
CacheLineSize = 64,
#ifdef GOOS_solaris
RuntimeGogoBytes = 80,
#else
#ifdef GOOS_windows
RuntimeGogoBytes = 80,
#else
RuntimeGogoBytes = 64,
#endif
#endif // Windows
#endif // Solaris
PhysPageSize = 4096,
PCQuantum = 1
};

View File

@ -95,10 +95,6 @@ func BenchmarkDeferMany(b *testing.B) {
// The value reported will include the padding between runtime.gogo and the
// next function in memory. That's fine.
func TestRuntimeGogoBytes(t *testing.T) {
// TODO(brainman): delete when issue 6973 is fixed.
if GOOS == "windows" {
t.Skip("skipping broken test on windows")
}
dir, err := ioutil.TempDir("", "go-build")
if err != nil {
t.Fatalf("failed to create temp directory: %v", err)