@@ -12,14 +12,12 @@ import (
1212 "crypto/sha256"
1313 "debug/elf"
1414 "debug/macho"
15- "debug/pe"
1615 "encoding/binary"
1716 "errors"
1817 "flag"
1918 "fmt"
2019 "io"
2120 "os"
22- "strconv"
2321 "strings"
2422
2523 "github.com/aws/aws-lc/util/ar"
@@ -299,81 +297,23 @@ func doAppleOS(objectBytes []byte) ([]byte, []byte, error) {
299297 return moduleText , moduleROData , nil
300298}
301299
302- func parseMapFile (mapPath string ) (map [string ]uint64 , error ) {
303- data , err := os .ReadFile (mapPath )
304- if err != nil {
305- return nil , fmt .Errorf ("failed to read map file: %s" , err .Error ())
306- }
307-
308- symbols := make (map [string ]uint64 )
309- // Symbol lines have format: SSSS:OOOOOOOO name RRRRRRRRRRRRRRRR Lib:Object
310- for _ , line := range strings .Split (string (data ), "\n " ) {
311- fields := strings .Fields (line )
312- if len (fields ) < 3 || ! strings .Contains (fields [0 ], ":" ) {
313- continue
314- }
315- name := fields [1 ]
316- if ! strings .HasPrefix (name , "BORINGSSL_bcm_" ) {
317- continue
318- }
319- rvaBase , err := strconv .ParseUint (fields [2 ], 16 , 64 )
320- if err != nil {
321- return nil , fmt .Errorf ("failed to parse Rva+Base for symbol %q: %s" , name , err .Error ())
322- }
323- if _ , exists := symbols [name ]; exists {
324- return nil , fmt .Errorf ("duplicate symbol %q in map file" , name )
325- }
326- symbols [name ] = rvaBase
327- }
328-
329- return symbols , nil
330- }
331-
332300func doWindows (objectBytes []byte , mapPath string ) ([]byte , []byte , error ) {
333- symbolAddrs , err := parseMapFile (mapPath )
301+ symbolAddrs , err := fipscommon . ParseMapFile (mapPath )
334302 if err != nil {
335303 return nil , nil , err
336304 }
337305
338- peFile , err := pe . NewFile ( bytes . NewReader ( objectBytes ) )
306+ peInfo , err := fipscommon . ParsePE ( objectBytes )
339307 if err != nil {
340- return nil , nil , fmt .Errorf ("failed to parse PE: %s" , err .Error ())
341- }
342-
343- var imageBase uint64
344- switch oh := peFile .OptionalHeader .(type ) {
345- case * pe.OptionalHeader64 :
346- imageBase = oh .ImageBase
347- case * pe.OptionalHeader32 :
348- imageBase = uint64 (oh .ImageBase )
349- default :
350- return nil , nil , errors .New ("unsupported PE optional header type" )
351- }
352-
353- resolveOffset := func (name string ) (uint64 , error ) {
354- addr , ok := symbolAddrs [name ]
355- if ! ok {
356- return 0 , fmt .Errorf ("symbol %q not found in map file" , name )
357- }
358- if addr < imageBase {
359- return 0 , fmt .Errorf ("symbol %q address 0x%x is below image base 0x%x" , name , addr , imageBase )
360- }
361- rva := addr - imageBase
362- for _ , s := range peFile .Sections {
363- start := uint64 (s .VirtualAddress )
364- if rva >= start && rva < start + uint64 (s .VirtualSize ) {
365- return rva - start + uint64 (s .Offset ), nil
366- }
367- }
368- return 0 , fmt .Errorf ("RVA 0x%x for %q not found in any PE section" , rva , name )
308+ return nil , nil , err
369309 }
370310
371311 extractRegion := func (startSym , endSym string ) ([]byte , error ) {
372- startOff , err := resolveOffset ( startSym )
312+ startOff , err := peInfo . ResolveSymbolFileOffset ( symbolAddrs , startSym )
373313 if err != nil {
374314 return nil , err
375315 }
376- endOff , err := resolveOffset ( endSym )
316+ endOff , err := peInfo . ResolveSymbolFileOffset ( symbolAddrs , endSym )
377317 if err != nil {
378318 return nil , err
379319 }
0 commit comments