return n, nil
}
-// TODO(brainman): remove 'goto bad' everywhere inside ldpe
-
func ldpe(ctxt *Link, input *bio.Reader, pkg string, length int64, pn string) {
+ err := ldpeError(ctxt, input, pkg, length, pn)
+ if err != nil {
+ Errorf(nil, "%s: malformed pe file: %v", pn, err)
+ }
+}
+
+func ldpeError(ctxt *Link, input *bio.Reader, pkg string, length int64, pn string) error {
if ctxt.Debugvlog != 0 {
ctxt.Logf("%5.2f ldpe %s\n", obj.Cputime(), pn)
}
sectsyms := make(map[*pe.Section]*Symbol)
sectdata := make(map[*pe.Section][]byte)
- var err error
-
// Some input files are archives containing multiple of
// object files, and pe.NewFile seeks to the start of
// input file and get confused. Create section reader
// TODO: replace pe.NewFile with pe.Load (grep for "add Load function" in debug/pe for details)
f, err := pe.NewFile(sr)
if err != nil {
- goto bad
+ return err
}
defer f.Close()
continue
}
- data, err2 := sect.Data()
- if err2 != nil {
- err = err2
- goto bad
+ data, err := sect.Data()
+ if err != nil {
+ return err
}
sectdata[sect] = data
s.Type = obj.STEXT
default:
- err = fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name)
- goto bad
+ return fmt.Errorf("unexpected flags %#06x for PE section %s", sect.Characteristics, sect.Name)
}
s.P = data
for j, r := range rsect.Relocs {
rp := &rs[j]
if int(r.SymbolTableIndex) >= len(f.COFFSymbols) {
- err = fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols))
- goto bad
+ return fmt.Errorf("relocation number %d symbol index idx=%d cannot be large then number of symbols %d", j, r.SymbolTableIndex, len(f.COFFSymbols))
}
pesym := &f.COFFSymbols[r.SymbolTableIndex]
- gosym, err2 := readpesym(ctxt, f, pesym, sectsyms, localSymVersion)
- if err2 != nil {
- err = err2
- goto bad
+ gosym, err := readpesym(ctxt, f, pesym, sectsyms, localSymVersion)
+ if err != nil {
+ return err
}
if gosym == nil {
- name, err2 := pesym.FullName(f.StringTable)
- if err2 != nil {
+ name, err := pesym.FullName(f.StringTable)
+ if err != nil {
name = string(pesym.Name[:])
}
- err = fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type)
- goto bad
+ return fmt.Errorf("reloc of invalid sym %s idx=%d type=%d", name, r.SymbolTableIndex, pesym.Type)
}
rp.Sym = gosym
numaux = int(pesym.NumberOfAuxSymbols)
- name, err2 := pesym.FullName(f.StringTable)
- if err2 != nil {
- err = err2
- goto bad
+ name, err := pesym.FullName(f.StringTable)
+ if err != nil {
+ return err
}
if name == "" {
continue
}
}
- s, err2 := readpesym(ctxt, f, pesym, sectsyms, localSymVersion)
- if err2 != nil {
- err = err2
- goto bad
+ s, err := readpesym(ctxt, f, pesym, sectsyms, localSymVersion)
+ if err != nil {
+ return err
}
if pesym.SectionNumber == 0 { // extern
}
if sect == nil {
- return
+ return nil
}
if s.Outer != nil {
}
}
- return
-
-bad:
- Errorf(nil, "%s: malformed pe file: %v", pn, err)
+ return nil
}
func issect(s *pe.COFFSymbol) bool {