github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/pkg/debug/pe/file_test.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package pe 6 7 import ( 8 "reflect" 9 "testing" 10 ) 11 12 type fileTest struct { 13 file string 14 hdr FileHeader 15 opthdr interface{} 16 sections []*SectionHeader 17 symbols []*Symbol 18 } 19 20 var fileTests = []fileTest{ 21 { 22 "testdata/gcc-386-mingw-obj", 23 FileHeader{0x014c, 0x000c, 0x0, 0x64a, 0x1e, 0x0, 0x104}, 24 nil, 25 []*SectionHeader{ 26 {".text", 0, 0, 36, 500, 1440, 0, 3, 0, 0x60300020}, 27 {".data", 0, 0, 0, 0, 0, 0, 0, 0, 3224371264}, 28 {".bss", 0, 0, 0, 0, 0, 0, 0, 0, 3224371328}, 29 {".debug_abbrev", 0, 0, 137, 536, 0, 0, 0, 0, 0x42100000}, 30 {".debug_info", 0, 0, 418, 673, 1470, 0, 7, 0, 1108344832}, 31 {".debug_line", 0, 0, 128, 1091, 1540, 0, 1, 0, 1108344832}, 32 {".rdata", 0, 0, 16, 1219, 0, 0, 0, 0, 1076887616}, 33 {".debug_frame", 0, 0, 52, 1235, 1550, 0, 2, 0, 1110441984}, 34 {".debug_loc", 0, 0, 56, 1287, 0, 0, 0, 0, 1108344832}, 35 {".debug_pubnames", 0, 0, 27, 1343, 1570, 0, 1, 0, 1108344832}, 36 {".debug_pubtypes", 0, 0, 38, 1370, 1580, 0, 1, 0, 1108344832}, 37 {".debug_aranges", 0, 0, 32, 1408, 1590, 0, 2, 0, 1108344832}, 38 }, 39 []*Symbol{ 40 {".file", 0x0, -2, 0x0, 0x67}, 41 {"_main", 0x0, 1, 0x20, 0x2}, 42 {".text", 0x0, 1, 0x0, 0x3}, 43 {".data", 0x0, 2, 0x0, 0x3}, 44 {".bss", 0x0, 3, 0x0, 0x3}, 45 {".debug_abbrev", 0x0, 4, 0x0, 0x3}, 46 {".debug_info", 0x0, 5, 0x0, 0x3}, 47 {".debug_line", 0x0, 6, 0x0, 0x3}, 48 {".rdata", 0x0, 7, 0x0, 0x3}, 49 {".debug_frame", 0x0, 8, 0x0, 0x3}, 50 {".debug_loc", 0x0, 9, 0x0, 0x3}, 51 {".debug_pubnames", 0x0, 10, 0x0, 0x3}, 52 {".debug_pubtypes", 0x0, 11, 0x0, 0x3}, 53 {".debug_aranges", 0x0, 12, 0x0, 0x3}, 54 {"___main", 0x0, 0, 0x20, 0x2}, 55 {"_puts", 0x0, 0, 0x20, 0x2}, 56 }, 57 }, 58 { 59 "testdata/gcc-386-mingw-exec", 60 FileHeader{0x014c, 0x000f, 0x4c6a1b60, 0x3c00, 0x282, 0xe0, 0x107}, 61 &OptionalHeader32{ 62 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, 63 [16]DataDirectory{ 64 {0x0, 0x0}, 65 {0x5000, 0x3c8}, 66 {0x0, 0x0}, 67 {0x0, 0x0}, 68 {0x0, 0x0}, 69 {0x0, 0x0}, 70 {0x0, 0x0}, 71 {0x0, 0x0}, 72 {0x0, 0x0}, 73 {0x7000, 0x18}, 74 {0x0, 0x0}, 75 {0x0, 0x0}, 76 {0x0, 0x0}, 77 {0x0, 0x0}, 78 {0x0, 0x0}, 79 {0x0, 0x0}, 80 }, 81 }, 82 []*SectionHeader{ 83 {".text", 0xcd8, 0x1000, 0xe00, 0x400, 0x0, 0x0, 0x0, 0x0, 0x60500060}, 84 {".data", 0x10, 0x2000, 0x200, 0x1200, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, 85 {".rdata", 0x120, 0x3000, 0x200, 0x1400, 0x0, 0x0, 0x0, 0x0, 0x40300040}, 86 {".bss", 0xdc, 0x4000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0400080}, 87 {".idata", 0x3c8, 0x5000, 0x400, 0x1600, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, 88 {".CRT", 0x18, 0x6000, 0x200, 0x1a00, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, 89 {".tls", 0x20, 0x7000, 0x200, 0x1c00, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, 90 {".debug_aranges", 0x20, 0x8000, 0x200, 0x1e00, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 91 {".debug_pubnames", 0x51, 0x9000, 0x200, 0x2000, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 92 {".debug_pubtypes", 0x91, 0xa000, 0x200, 0x2200, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 93 {".debug_info", 0xe22, 0xb000, 0x1000, 0x2400, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 94 {".debug_abbrev", 0x157, 0xc000, 0x200, 0x3400, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 95 {".debug_line", 0x144, 0xd000, 0x200, 0x3600, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 96 {".debug_frame", 0x34, 0xe000, 0x200, 0x3800, 0x0, 0x0, 0x0, 0x0, 0x42300000}, 97 {".debug_loc", 0x38, 0xf000, 0x200, 0x3a00, 0x0, 0x0, 0x0, 0x0, 0x42100000}, 98 }, 99 []*Symbol{}, 100 }, 101 { 102 "testdata/gcc-amd64-mingw-obj", 103 FileHeader{0x8664, 0x6, 0x0, 0x198, 0x12, 0x0, 0x4}, 104 nil, 105 []*SectionHeader{ 106 {".text", 0x0, 0x0, 0x30, 0x104, 0x15c, 0x0, 0x3, 0x0, 0x60500020}, 107 {".data", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500040}, 108 {".bss", 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0500080}, 109 {".rdata", 0x0, 0x0, 0x10, 0x134, 0x0, 0x0, 0x0, 0x0, 0x40500040}, 110 {".xdata", 0x0, 0x0, 0xc, 0x144, 0x0, 0x0, 0x0, 0x0, 0x40300040}, 111 {".pdata", 0x0, 0x0, 0xc, 0x150, 0x17a, 0x0, 0x3, 0x0, 0x40300040}, 112 }, 113 []*Symbol{ 114 {".file", 0x0, -2, 0x0, 0x67}, 115 {"main", 0x0, 1, 0x20, 0x2}, 116 {".text", 0x0, 1, 0x0, 0x3}, 117 {".data", 0x0, 2, 0x0, 0x3}, 118 {".bss", 0x0, 3, 0x0, 0x3}, 119 {".rdata", 0x0, 4, 0x0, 0x3}, 120 {".xdata", 0x0, 5, 0x0, 0x3}, 121 {".pdata", 0x0, 6, 0x0, 0x3}, 122 {"__main", 0x0, 0, 0x20, 0x2}, 123 {"puts", 0x0, 0, 0x20, 0x2}, 124 }, 125 }, 126 { 127 "testdata/gcc-amd64-mingw-exec", 128 FileHeader{0x8664, 0x9, 0x53472993, 0x0, 0x0, 0xf0, 0x22f}, 129 &OptionalHeader64{ 130 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, 131 [16]DataDirectory{ 132 {0x0, 0x0}, 133 {0xe000, 0x990}, 134 {0x0, 0x0}, 135 {0xa000, 0x498}, 136 {0x0, 0x0}, 137 {0x0, 0x0}, 138 {0x0, 0x0}, 139 {0x0, 0x0}, 140 {0x0, 0x0}, 141 {0x10000, 0x28}, 142 {0x0, 0x0}, 143 {0x0, 0x0}, 144 {0xe254, 0x218}, 145 {0x0, 0x0}, 146 {0x0, 0x0}, 147 {0x0, 0x0}, 148 }, 149 }, 150 []*SectionHeader{ 151 {".text", 0x6860, 0x1000, 0x6a00, 0x400, 0x0, 0x0, 0x0, 0x0, 0x60500020}, 152 {".data", 0xe0, 0x8000, 0x200, 0x6e00, 0x0, 0x0, 0x0, 0x0, 0xc0500040}, 153 {".rdata", 0x6b0, 0x9000, 0x800, 0x7000, 0x0, 0x0, 0x0, 0x0, 0x40600040}, 154 {".pdata", 0x498, 0xa000, 0x600, 0x7800, 0x0, 0x0, 0x0, 0x0, 0x40300040}, 155 {".xdata", 0x488, 0xb000, 0x600, 0x7e00, 0x0, 0x0, 0x0, 0x0, 0x40300040}, 156 {".bss", 0x1410, 0xc000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc0600080}, 157 {".idata", 0x990, 0xe000, 0xa00, 0x8400, 0x0, 0x0, 0x0, 0x0, 0xc0300040}, 158 {".CRT", 0x68, 0xf000, 0x200, 0x8e00, 0x0, 0x0, 0x0, 0x0, 0xc0400040}, 159 {".tls", 0x48, 0x10000, 0x200, 0x9000, 0x0, 0x0, 0x0, 0x0, 0xc0600040}, 160 }, 161 []*Symbol{}, 162 }, 163 } 164 165 func isOptHdrEq(a, b interface{}) bool { 166 switch va := a.(type) { 167 case *OptionalHeader32: 168 vb, ok := b.(*OptionalHeader32) 169 if !ok { 170 return false 171 } 172 return *vb == *va 173 case *OptionalHeader64: 174 vb, ok := b.(*OptionalHeader64) 175 if !ok { 176 return false 177 } 178 return *vb == *va 179 case nil: 180 return b == nil 181 } 182 return false 183 } 184 185 func TestOpen(t *testing.T) { 186 for i := range fileTests { 187 tt := &fileTests[i] 188 189 f, err := Open(tt.file) 190 if err != nil { 191 t.Error(err) 192 continue 193 } 194 if !reflect.DeepEqual(f.FileHeader, tt.hdr) { 195 t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.FileHeader, tt.hdr) 196 continue 197 } 198 if !isOptHdrEq(tt.opthdr, f.OptionalHeader) { 199 t.Errorf("open %s:\n\thave %#v\n\twant %#v\n", tt.file, f.OptionalHeader, tt.opthdr) 200 continue 201 } 202 203 for i, sh := range f.Sections { 204 if i >= len(tt.sections) { 205 break 206 } 207 have := &sh.SectionHeader 208 want := tt.sections[i] 209 if !reflect.DeepEqual(have, want) { 210 t.Errorf("open %s, section %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want) 211 } 212 } 213 tn := len(tt.sections) 214 fn := len(f.Sections) 215 if tn != fn { 216 t.Errorf("open %s: len(Sections) = %d, want %d", tt.file, fn, tn) 217 } 218 for i, have := range f.Symbols { 219 if i >= len(tt.symbols) { 220 break 221 } 222 want := tt.symbols[i] 223 if !reflect.DeepEqual(have, want) { 224 t.Errorf("open %s, symbol %d:\n\thave %#v\n\twant %#v\n", tt.file, i, have, want) 225 } 226 } 227 } 228 } 229 230 func TestOpenFailure(t *testing.T) { 231 filename := "file.go" // not a PE file 232 _, err := Open(filename) // don't crash 233 if err == nil { 234 t.Errorf("open %s: succeeded unexpectedly", filename) 235 } 236 }