diff options
| author | Alex Brainman <alex.brainman@gmail.com> | 2016-04-20 15:58:55 +1000 |
|---|---|---|
| committer | Alex Brainman <alex.brainman@gmail.com> | 2016-04-21 01:03:17 +0000 |
| commit | 285a18436d480ef91b2af236d5ddd2fa7fa49de8 (patch) | |
| tree | bbe99429b59a91ea42783449b0ad55bb10af07c5 /src/debug | |
| parent | 75b886ab790782f34945c0e1b0dee4189399ac9e (diff) | |
| download | go-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/debug')
| -rw-r--r-- | src/debug/pe/file.go | 10 | ||||
| -rw-r--r-- | src/debug/pe/section.go | 27 |
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) +} |
