1
0
mirror of https://github.com/golang/go synced 2024-11-22 02:04:40 -07:00

debug/pe: ImportedSymbols fixes

R=golang-dev, brainman, mattn, rsc
CC=golang-dev
https://golang.org/cl/4001058
This commit is contained in:
Wei Guangjing 2011-02-10 10:22:32 -05:00 committed by Russ Cox
parent 9fe490ee38
commit 44bcc1fcd9

View File

@ -57,7 +57,6 @@ type ImportDirectory struct {
FirstThunk uint32 FirstThunk uint32
dll string dll string
rva []uint32
} }
// Data reads and returns the contents of the PE section. // Data reads and returns the contents of the PE section.
@ -267,34 +266,28 @@ func (f *File) ImportedSymbols() ([]string, os.Error) {
} }
ida = append(ida, dt) ida = append(ida, dt)
} }
for i, _ := range ida {
for len(d) > 0 {
va := binary.LittleEndian.Uint32(d[0:4])
d = d[4:]
if va == 0 {
break
}
ida[i].rva = append(ida[i].rva, va)
}
}
for _, _ = range ida {
for len(d) > 0 {
va := binary.LittleEndian.Uint32(d[0:4])
d = d[4:]
if va == 0 {
break
}
}
}
names, _ := ds.Data() names, _ := ds.Data()
var all []string var all []string
for _, dt := range ida { for _, dt := range ida {
dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress)) dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress))
for _, va := range dt.rva { d, _ = ds.Data()
// seek to OriginalFirstThunk
d = d[dt.OriginalFirstThunk-ds.VirtualAddress:]
for len(d) > 0 {
va := binary.LittleEndian.Uint32(d[0:4])
d = d[4:]
if va == 0 {
break
}
if va&0x80000000 > 0 { // is Ordinal
// TODO add dynimport ordinal support.
//ord := va&0x0000FFFF
} else {
fn, _ := getString(names, int(va-ds.VirtualAddress+2)) fn, _ := getString(names, int(va-ds.VirtualAddress+2))
all = append(all, fn+":"+dt.dll) all = append(all, fn+":"+dt.dll)
} }
} }
}
return all, nil return all, nil
} }