aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2016-04-20 15:58:55 +1000
committerAlex Brainman <alex.brainman@gmail.com>2016-04-21 01:03:17 +0000
commit285a18436d480ef91b2af236d5ddd2fa7fa49de8 (patch)
treebbe99429b59a91ea42783449b0ad55bb10af07c5 /src
parent75b886ab790782f34945c0e1b0dee4189399ac9e (diff)
downloadgo-285a18436d480ef91b2af236d5ddd2fa7fa49de8.tar.xz
debug/pe: pretty section.go code
Introduce (*SectionHeader32).fullName and add documentation comments. Updates #15345 Change-Id: I8f3b8ab9492642d62e7aad010c91c68daea3f14b Reviewed-on: https://go-review.googlesource.com/22301 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Alex Brainman <alex.brainman@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src')
-rw-r--r--src/debug/pe/file.go10
-rw-r--r--src/debug/pe/section.go27
2 files changed, 27 insertions, 10 deletions
diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go
index 3affd25185..73b7c1cba2 100644
--- a/src/debug/pe/file.go
+++ b/src/debug/pe/file.go
@@ -12,7 +12,6 @@ import (
"fmt"
"io"
"os"
- "strconv"
)
// A File represents an open PE file.
@@ -172,12 +171,9 @@ func NewFile(r io.ReaderAt) (*File, error) {
if err := binary.Read(sr, binary.LittleEndian, sh); err != nil {
return nil, err
}
- var name string
- if sh.Name[0] == '\x2F' {
- si, _ := strconv.Atoi(cstring(sh.Name[1:]))
- name, _ = getString(ss, si)
- } else {
- name = cstring(sh.Name[0:])
+ name, err := sh.fullName(f.StringTable)
+ if err != nil {
+ return nil, err
}
s := new(Section)
s.SectionHeader = SectionHeader{
diff --git a/src/debug/pe/section.go b/src/debug/pe/section.go
index 31cff272f3..ded3ec4393 100644
--- a/src/debug/pe/section.go
+++ b/src/debug/pe/section.go
@@ -6,8 +6,10 @@ package pe
import (
"io"
+ "strconv"
)
+// SectionHeader32 represents real PE COFF section header.
type SectionHeader32 struct {
Name [8]uint8
VirtualSize uint32
@@ -21,6 +23,22 @@ type SectionHeader32 struct {
Characteristics uint32
}
+// fullName finds real name of section sh. Normally name is stored
+// in sh.Name, but if it is longer then 8 characters, it is stored
+// in COFF string table st instead.
+func (sh *SectionHeader32) fullName(st StringTable) (string, error) {
+ if sh.Name[0] != '/' {
+ return cstring(sh.Name[:]), nil
+ }
+ i, err := strconv.Atoi(cstring(sh.Name[1:]))
+ if err != nil {
+ return "", err
+ }
+ return st.String(uint32(i))
+}
+
+// SectionHeader is similar to SectionHeader32 with Name
+// field replaced by Go string.
type SectionHeader struct {
Name string
VirtualSize uint32
@@ -34,6 +52,7 @@ type SectionHeader struct {
Characteristics uint32
}
+// Section provides access to PE COFF section.
type Section struct {
SectionHeader
@@ -47,7 +66,7 @@ type Section struct {
sr *io.SectionReader
}
-// Data reads and returns the contents of the PE section.
+// Data reads and returns the contents of the PE section s.
func (s *Section) Data() ([]byte, error) {
dat := make([]byte, s.sr.Size())
n, err := s.sr.ReadAt(dat, 0)
@@ -57,5 +76,7 @@ func (s *Section) Data() ([]byte, error) {
return dat[0:n], err
}
-// Open returns a new ReadSeeker reading the PE section.
-func (s *Section) Open() io.ReadSeeker { return io.NewSectionReader(s.sr, 0, 1<<63-1) }
+// Open returns a new ReadSeeker reading the PE section s.
+func (s *Section) Open() io.ReadSeeker {
+ return io.NewSectionReader(s.sr, 0, 1<<63-1)
+}