]> Cypherpunks repositories - gostls13.git/commitdiff
debug/pe: fixes ImportedSymbols for Win64.
authorWei Guangjing <vcc.163@gmail.com>
Tue, 12 Jul 2011 18:29:38 +0000 (11:29 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 12 Jul 2011 18:29:38 +0000 (11:29 -0700)
R=golang-dev, alex.brainman
CC=golang-dev
https://golang.org/cl/4639086

src/pkg/debug/pe/file.go

index 04991f781bedb261c58136f8842aebfab75af497..c934dd4477a946ceba2e9c9636f6d6ec6ffcf5f0 100644 (file)
@@ -245,6 +245,7 @@ func (f *File) DWARF() (*dwarf.Data, os.Error) {
 // satisfied by other libraries at dynamic load time.
 // It does not return weak symbols.
 func (f *File) ImportedSymbols() ([]string, os.Error) {
+       pe64 := f.Machine == IMAGE_FILE_MACHINE_AMD64
        ds := f.Section(".idata")
        if ds == nil {
                // not dynamic, so no libraries
@@ -274,17 +275,31 @@ func (f *File) ImportedSymbols() ([]string, os.Error) {
                // 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))
-                               all = append(all, fn+":"+dt.dll)
+                       if pe64 { // 64bit
+                               va := binary.LittleEndian.Uint64(d[0:8])
+                               d = d[8:]
+                               if va == 0 {
+                                       break
+                               }
+                               if va&0x8000000000000000 > 0 { // is Ordinal
+                                       // TODO add dynimport ordinal support.
+                               } else {
+                                       fn, _ := getString(names, int(uint32(va)-ds.VirtualAddress+2))
+                                       all = append(all, fn+":"+dt.dll)
+                               }
+                       } else { // 32bit
+                               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)
+                               }
                        }
                }
        }