aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/debug
diff options
context:
space:
mode:
authorWei Guangjing <vcc.163@gmail.com>2011-07-12 11:29:38 -0700
committerRuss Cox <rsc@golang.org>2011-07-12 11:29:38 -0700
commitf340b3de5a19c310aa38abc6f474c366a7b7d89b (patch)
tree9040766eb5d51611e7b21617fc1d9b2bad76b0ae /src/pkg/debug
parent67edf9cb87847c88224c43206d7eccf65ac18acd (diff)
downloadgo-f340b3de5a19c310aa38abc6f474c366a7b7d89b.tar.xz
debug/pe: fixes ImportedSymbols for Win64.
R=golang-dev, alex.brainman CC=golang-dev https://golang.org/cl/4639086
Diffstat (limited to 'src/pkg/debug')
-rw-r--r--src/pkg/debug/pe/file.go37
1 files changed, 26 insertions, 11 deletions
diff --git a/src/pkg/debug/pe/file.go b/src/pkg/debug/pe/file.go
index 04991f781b..c934dd4477 100644
--- a/src/pkg/debug/pe/file.go
+++ b/src/pkg/debug/pe/file.go
@@ -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)
+ }
}
}
}