From 387895f9ac5d34bfd32f23c1640b598c105bcb73 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Wed, 16 Apr 2014 22:10:59 -0400 Subject: [PATCH] debug/pe: add optional header to File This information is required by cmd/nm to calculate absolute symbol addresses. Update #6936 Update #7738 LGTM=rsc R=golang-codereviews, bradfitz, gobot, rsc CC=golang-codereviews https://golang.org/cl/87500043 --- src/pkg/debug/pe/file.go | 35 ++++- src/pkg/debug/pe/file_test.go | 139 ++++++++++++++++-- src/pkg/debug/pe/pe.go | 72 +++++++++ .../debug/pe/testdata/gcc-amd64-mingw-exec | Bin 0 -> 37376 bytes src/pkg/debug/pe/testdata/gcc-amd64-mingw-obj | Bin 0 -> 736 bytes 5 files changed, 226 insertions(+), 20 deletions(-) create mode 100644 src/pkg/debug/pe/testdata/gcc-amd64-mingw-exec create mode 100644 src/pkg/debug/pe/testdata/gcc-amd64-mingw-obj diff --git a/src/pkg/debug/pe/file.go b/src/pkg/debug/pe/file.go index d0005bacf3..ce6f1408fe 100644 --- a/src/pkg/debug/pe/file.go +++ b/src/pkg/debug/pe/file.go @@ -13,13 +13,15 @@ import ( "io" "os" "strconv" + "unsafe" ) // A File represents an open PE file. type File struct { FileHeader - Sections []*Section - Symbols []*Symbol + OptionalHeader interface{} // of type *OptionalHeader32 or *OptionalHeader64 + Sections []*Section + Symbols []*Symbol closer io.Closer } @@ -196,10 +198,33 @@ func NewFile(r io.ReaderAt) (*File, error) { } } - // Process sections. + // Read optional header. sr.Seek(base, os.SEEK_SET) - binary.Read(sr, binary.LittleEndian, &f.FileHeader) - sr.Seek(int64(f.FileHeader.SizeOfOptionalHeader), os.SEEK_CUR) //Skip OptionalHeader + if err := binary.Read(sr, binary.LittleEndian, &f.FileHeader); err != nil { + return nil, err + } + var oh32 OptionalHeader32 + var oh64 OptionalHeader64 + switch uintptr(f.FileHeader.SizeOfOptionalHeader) { + case unsafe.Sizeof(oh32): + if err := binary.Read(sr, binary.LittleEndian, &oh32); err != nil { + return nil, err + } + if oh32.Magic != 0x10b { // PE32 + return nil, fmt.Errorf("pe32 optional header has unexpected Magic of 0x%x", oh32.Magic) + } + f.OptionalHeader = &oh32 + case unsafe.Sizeof(oh64): + if err := binary.Read(sr, binary.LittleEndian, &oh64); err != nil { + return nil, err + } + if oh64.Magic != 0x20b { // PE32+ + return nil, fmt.Errorf("pe32+ optional header has unexpected Magic of 0x%x", oh64.Magic) + } + f.OptionalHeader = &oh64 + } + + // Process sections. f.Sections = make([]*Section, f.FileHeader.NumberOfSections) for i := 0; i < int(f.FileHeader.NumberOfSections); i++ { sh := new(SectionHeader32) diff --git a/src/pkg/debug/pe/file_test.go b/src/pkg/debug/pe/file_test.go index c0f9fcb95d..ddbb271744 100644 --- a/src/pkg/debug/pe/file_test.go +++ b/src/pkg/debug/pe/file_test.go @@ -12,6 +12,7 @@ import ( type fileTest struct { file string hdr FileHeader + opthdr interface{} sections []*SectionHeader symbols []*Symbol } @@ -20,6 +21,7 @@ var fileTests = []fileTest{ { "testdata/gcc-386-mingw-obj", FileHeader{0x014c, 0x000c, 0x0, 0x64a, 0x1e, 0x0, 0x104}, + nil, []*SectionHeader{ {".text", 0, 0, 36, 500, 1440, 0, 3, 0, 0x60300020}, {".data", 0, 0, 0, 0, 0, 0, 0, 0, 3224371264}, @@ -56,27 +58,130 @@ var fileTests = []fileTest{ { "testdata/gcc-386-mingw-exec", FileHeader{0x014c, 0x000f, 0x4c6a1b60, 0x3c00, 0x282, 0xe0, 0x107}, + &OptionalHeader32{ + 0x10b, 0x2, 0x38, 0xe00, 0x1a00, 0x200, 0x1160, 0x1000, 0x2000, 0x400000, 0x1000, 0x200, 0x4, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x10000, 0x400, 0x14abb, 0x3, 0x0, 0x200000, 0x1000, 0x100000, 0x1000, 0x0, 0x10, + [16]DataDirectory{ + {0x0, 0x0}, + {0x5000, 0x3c8}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x7000, 0x18}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + }, + }, + []*SectionHeader{ + {".text", 0xcd8, 0x1000, 0xe00, 0x400, 0x0, 0x0, 0x0, 0x0, 0x60500060}, + {".data", 0x10, 0x2000, 0x200, 0x1200, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, + {".rdata", 0x120, 0x3000, 0x200, 0x1400, 0x0, 0x0, 0x0, 0x0, 0x40300040}, + {".bss", 0xdc, 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0400080}, + {".idata", 0x3c8, 0x5000, 0x400, 0x1600, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, + {".CRT", 0x18, 0x6000, 0x200, 0x1a00, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, + {".tls", 0x20, 0x7000, 0x200, 0x1c00, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, + {".debug_aranges", 0x20, 0x8000, 0x200, 0x1e00, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_pubnames", 0x51, 0x9000, 0x200, 0x2000, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_pubtypes", 0x91, 0xa000, 0x200, 0x2200, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_info", 0xe22, 0xb000, 0x1000, 0x2400, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_abbrev", 0x157, 0xc000, 0x200, 0x3400, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_line", 0x144, 0xd000, 0x200, 0x3600, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + {".debug_frame", 0x34, 0xe000, 0x200, 0x3800, 0x0, 0x0, 0x0, 0x0, 0x42300000}, + {".debug_loc", 0x38, 0xf000, 0x200, 0x3a00, 0x0, 0x0, 0x0, 0x0, 0x42100000}, + }, + []*Symbol{}, + }, + { + "testdata/gcc-amd64-mingw-obj", + FileHeader{0x8664, 0x6, 0x0, 0x198, 0x12, 0x0, 0x4}, + nil, + []*SectionHeader{ + {".text", 0x0, 0x0, 0x30, 0x104, 0x15c, 0x0, 0x3, 0x0, 0x60500020}, + {".data", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500040}, + {".bss", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500080}, + {".rdata", 0x0, 0x0, 0x10, 0x134, 0x0, 0x0, 0x0, 0x0, 0x40500040}, + {".xdata", 0x0, 0x0, 0xc, 0x144, 0x0, 0x0, 0x0, 0x0, 0x40300040}, + {".pdata", 0x0, 0x0, 0xc, 0x150, 0x17a, 0x0, 0x3, 0x0, 0x40300040}, + }, + []*Symbol{ + {".file", 0x0, -2, 0x0, 0x67}, + {"main", 0x0, 1, 0x20, 0x2}, + {".text", 0x0, 1, 0x0, 0x3}, + {".data", 0x0, 2, 0x0, 0x3}, + {".bss", 0x0, 3, 0x0, 0x3}, + {".rdata", 0x0, 4, 0x0, 0x3}, + {".xdata", 0x0, 5, 0x0, 0x3}, + {".pdata", 0x0, 6, 0x0, 0x3}, + {"__main", 0x0, 0, 0x20, 0x2}, + {"puts", 0x0, 0, 0x20, 0x2}, + }, + }, + { + "testdata/gcc-amd64-mingw-exec", + FileHeader{0x8664, 0x9, 0x53472993, 0x0, 0x0, 0xf0, 0x22f}, + &OptionalHeader64{ + 0x20b, 0x2, 0x16, 0x6a00, 0x2400, 0x1600, 0x14e0, 0x1000, 0x400000, 0x1000, 0x200, 0x4, 0x0, 0x0, 0x0, 0x5, 0x2, 0x0, 0x11000, 0x400, 0x1841e, 0x3, 0x0, 0x200000, 0x1000, 0x100000, 0x1000, 0x0, 0x10, + [16]DataDirectory{ + {0x0, 0x0}, + {0xe000, 0x990}, + {0x0, 0x0}, + {0xa000, 0x498}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x10000, 0x28}, + {0x0, 0x0}, + {0x0, 0x0}, + {0xe254, 0x218}, + {0x0, 0x0}, + {0x0, 0x0}, + {0x0, 0x0}, + }, + }, []*SectionHeader{ - {Name: ".text", VirtualSize: 0xcd8, VirtualAddress: 0x1000, Size: 0xe00, Offset: 0x400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x60500060}, - {Name: ".data", VirtualSize: 0x10, VirtualAddress: 0x2000, Size: 0x200, Offset: 0x1200, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040}, - {Name: ".rdata", VirtualSize: 0x120, VirtualAddress: 0x3000, Size: 0x200, Offset: 0x1400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x40300040}, - {Name: ".bss", VirtualSize: 0xdc, VirtualAddress: 0x4000, Size: 0x0, Offset: 0x0, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0400080}, - {Name: ".idata", VirtualSize: 0x3c8, VirtualAddress: 0x5000, Size: 0x400, Offset: 0x1600, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040}, - {Name: ".CRT", VirtualSize: 0x18, VirtualAddress: 0x6000, Size: 0x200, Offset: 0x1a00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040}, - {Name: ".tls", VirtualSize: 0x20, VirtualAddress: 0x7000, Size: 0x200, Offset: 0x1c00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0xc0300040}, - {Name: ".debug_aranges", VirtualSize: 0x20, VirtualAddress: 0x8000, Size: 0x200, Offset: 0x1e00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_pubnames", VirtualSize: 0x51, VirtualAddress: 0x9000, Size: 0x200, Offset: 0x2000, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_pubtypes", VirtualSize: 0x91, VirtualAddress: 0xa000, Size: 0x200, Offset: 0x2200, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_info", VirtualSize: 0xe22, VirtualAddress: 0xb000, Size: 0x1000, Offset: 0x2400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_abbrev", VirtualSize: 0x157, VirtualAddress: 0xc000, Size: 0x200, Offset: 0x3400, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_line", VirtualSize: 0x144, VirtualAddress: 0xd000, Size: 0x200, Offset: 0x3600, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, - {Name: ".debug_frame", VirtualSize: 0x34, VirtualAddress: 0xe000, Size: 0x200, Offset: 0x3800, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42300000}, - {Name: ".debug_loc", VirtualSize: 0x38, VirtualAddress: 0xf000, Size: 0x200, Offset: 0x3a00, PointerToRelocations: 0x0, PointerToLineNumbers: 0x0, NumberOfRelocations: 0x0, NumberOfLineNumbers: 0x0, Characteristics: 0x42100000}, + {".text", 0x6860, 0x1000, 0x6a00, 0x400, 0x0, 0x0, 0x0, 0x0, 0x60500020}, + {".data", 0xe0, 0x8000, 0x200, 0x6e00, 0x0, 0x0, 0x0, 0x0, 0xc0500040}, + {".rdata", 0x6b0, 0x9000, 0x800, 0x7000, 0x0, 0x0, 0x0, 0x0, 0x40600040}, + {".pdata", 0x498, 0xa000, 0x600, 0x7800, 0x0, 0x0, 0x0, 0x0, 0x40300040}, + {".xdata", 0x488, 0xb000, 0x600, 0x7e00, 0x0, 0x0, 0x0, 0x0, 0x40300040}, + {".bss", 0x1410, 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0600080}, + {".idata", 0x990, 0xe000, 0xa00, 0x8400, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, + {".CRT", 0x68, 0xf000, 0x200, 0x8e00, 0x0, 0x0, 0x0, 0x0, 0xc0400040}, + {".tls", 0x48, 0x10000, 0x200, 0x9000, 0x0, 0x0, 0x0, 0x0, 0xc0600040}, }, []*Symbol{}, }, } +func isOptHdrEq(a, b interface{}) bool { + switch va := a.(type) { + case *OptionalHeader32: + vb, ok := b.(*OptionalHeader32) + if !ok { + return false + } + return *vb == *va + case *OptionalHeader64: + vb, ok := b.(*OptionalHeader64) + if !ok { + return false + } + return *vb == *va + case nil: + return b == nil + } + return false +} + func TestOpen(t *testing.T) { for i := range fileTests { tt := &fileTests[i] @@ -90,6 +195,10 @@ func TestOpen(t *testing.T) { t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr) continue } + if !isOptHdrEq(tt.opthdr, f.OptionalHeader) { + t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.OptionalHeader, tt.opthdr) + continue + } for i, sh := range f.Sections { if i >= len(tt.sections) { diff --git a/src/pkg/debug/pe/pe.go b/src/pkg/debug/pe/pe.go index 0606217b3b..8e90b1b513 100644 --- a/src/pkg/debug/pe/pe.go +++ b/src/pkg/debug/pe/pe.go @@ -14,6 +14,78 @@ type FileHeader struct { Characteristics uint16 } +type DataDirectory struct { + VirtualAddress uint32 + Size uint32 +} + +type OptionalHeader32 struct { + Magic uint16 + MajorLinkerVersion uint8 + MinorLinkerVersion uint8 + SizeOfCode uint32 + SizeOfInitializedData uint32 + SizeOfUninitializedData uint32 + AddressOfEntryPoint uint32 + BaseOfCode uint32 + BaseOfData uint32 + ImageBase uint32 + SectionAlignment uint32 + FileAlignment uint32 + MajorOperatingSystemVersion uint16 + MinorOperatingSystemVersion uint16 + MajorImageVersion uint16 + MinorImageVersion uint16 + MajorSubsystemVersion uint16 + MinorSubsystemVersion uint16 + Win32VersionValue uint32 + SizeOfImage uint32 + SizeOfHeaders uint32 + CheckSum uint32 + Subsystem uint16 + DllCharacteristics uint16 + SizeOfStackReserve uint32 + SizeOfStackCommit uint32 + SizeOfHeapReserve uint32 + SizeOfHeapCommit uint32 + LoaderFlags uint32 + NumberOfRvaAndSizes uint32 + DataDirectory [16]DataDirectory +} + +type OptionalHeader64 struct { + Magic uint16 + MajorLinkerVersion uint8 + MinorLinkerVersion uint8 + SizeOfCode uint32 + SizeOfInitializedData uint32 + SizeOfUninitializedData uint32 + AddressOfEntryPoint uint32 + BaseOfCode uint32 + ImageBase uint64 + SectionAlignment uint32 + FileAlignment uint32 + MajorOperatingSystemVersion uint16 + MinorOperatingSystemVersion uint16 + MajorImageVersion uint16 + MinorImageVersion uint16 + MajorSubsystemVersion uint16 + MinorSubsystemVersion uint16 + Win32VersionValue uint32 + SizeOfImage uint32 + SizeOfHeaders uint32 + CheckSum uint32 + Subsystem uint16 + DllCharacteristics uint16 + SizeOfStackReserve uint64 + SizeOfStackCommit uint64 + SizeOfHeapReserve uint64 + SizeOfHeapCommit uint64 + LoaderFlags uint32 + NumberOfRvaAndSizes uint32 + DataDirectory [16]DataDirectory +} + type SectionHeader32 struct { Name [8]uint8 VirtualSize uint32 diff --git a/src/pkg/debug/pe/testdata/gcc-amd64-mingw-exec b/src/pkg/debug/pe/testdata/gcc-amd64-mingw-exec new file mode 100644 index 0000000000000000000000000000000000000000..78d4e5fed98b09866e047db6a670b9721c03badb GIT binary patch literal 37376 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 HX`rfq)vQIg literal 0 HcmV?d00001 -- 2.50.0