]> Cypherpunks repositories - gostls13.git/commitdiff
debug/pe: ImportedSymbols fixes
authorWei Guangjing <vcc.163@gmail.com>
Thu, 10 Feb 2011 15:22:32 +0000 (10:22 -0500)
committerRuss Cox <rsc@golang.org>
Thu, 10 Feb 2011 15:22:32 +0000 (10:22 -0500)
R=golang-dev, brainman, mattn, rsc
CC=golang-dev
https://golang.org/cl/4001058

src/pkg/debug/pe/file.go

index 82c02407bbe3a2587ad3010e5521aee193fb3e04..1bcbdc5e9a5706af9af14d09b14b255ca94b33f7 100644 (file)
@@ -57,7 +57,6 @@ type ImportDirectory struct {
        FirstThunk         uint32
 
        dll string
-       rva []uint32
 }
 
 // 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)
        }
-       for i, _ := range ida {
+       names, _ := ds.Data()
+       var all []string
+       for _, dt := range ida {
+               dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress))
+               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
                        }
-                       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
+                       if va&0x80000000 > 0 { // is Ordinal
+                               // TODO add dynimport ordinal support.
+                               //ord := va&0x0000FFFF
+                       } else {
+                               fn, _ := getString(names, int(va-ds.VirtualAddress+2))
+                               all = append(all, fn+":"+dt.dll)
                        }
                }
        }
-       names, _ := ds.Data()
-       var all []string
-       for _, dt := range ida {
-               dt.dll, _ = getString(names, int(dt.Name-ds.VirtualAddress))
-               for _, va := range dt.rva {
-                       fn, _ := getString(names, int(va-ds.VirtualAddress+2))
-                       all = append(all, fn+":"+dt.dll)
-               }
-       }
 
        return all, nil
 }