]> Cypherpunks repositories - gostls13.git/commitdiff
debug/pe: pretty section.go code
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 20 Apr 2016 05:58:55 +0000 (15:58 +1000)
committerAlex Brainman <alex.brainman@gmail.com>
Thu, 21 Apr 2016 01:03:17 +0000 (01:03 +0000)
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>

src/debug/pe/file.go
src/debug/pe/section.go

index 3affd25185deb68378d07b45331dc79b10aa3747..73b7c1cba2405d51a4e969b7114bc522853ffbc5 100644 (file)
@@ -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{
index 31cff272f33553cbf7e9b38e69aad99a5718c7af..ded3ec439376c5649e81986bb3da464960b06e74 100644 (file)
@@ -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)
+}