;
; Copyright (c) 2011, Hewlett-Packard Company. All rights reserved.<BR>
; 
; SPDX-License-Identifier: BSD-2-Clause-Patent
; 

  LOCAL &imgstart &filehdrstart &debugdirentryrva &debugtype &debugrva &dwarfsig &baseofcode &baseofdata &elfbase &elfpath &pathoffset
  ENTRY &imgstart

  &imgstart=&imgstart
  print "PE32 image found at &imgstart"

  ; offset from dos hdr to PE file hdr
  &filehdrstart=&imgstart+Data.Long(c:&imgstart+0x3C)

  ; offset to debug dir in PE hdrs
  &debugdirentryrva=Data.Long(c:&filehdrstart+0xA8)
  if &debugdirentryrva==0
  (
    print "no debug dir for image at &imgstart"
    enddo
  )
  
  &debugtype=Data.Long(c:&imgstart+&debugdirentryrva+0xc)
  if (&debugtype!=0xdf)&&(&debugtype!=0x02)
  (
    print "debug type is not dwarf for image at &imgstart, it's &debugtype"
    enddo
  )
  
  &debugrva=Data.Long(c:&imgstart+&debugdirentryrva+0x14)
  &dwarfsig=Data.Long(c:&imgstart+&debugrva)
  
  if &dwarfsig==0x66727764
  (
    &pathoffset=0xc
  )
  else
  (
    if &dwarfsig==0x3031424E
    (
      &pathoffset=0x10
    )
    else
    (
      print "debug signature not found for image at &imgstart, its &dwarfsig"
      enddo
    )
  )

  &elfpath=Data.String(c:&imgstart+&debugrva+&pathoffset)

  &baseofcode=&imgstart+Data.Long(c:&filehdrstart+0x28)
  &baseofdata=&imgstart+Data.Long(c:&filehdrstart+0x2c)
 
  if (&baseofcode<&baseofdata)&&(&baseofcode!=0)
  (
    &elfbase=&baseofcode;
  )
  else
  (
    &elfbase=&baseofdata;
  )

  print "found path &elfpath"
        ON ERROR GOSUB
              return
  data.load.elf &elfpath &elfbase /NOCODE /NOCLEAR
        ON error

enddo
