aboutsummaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug')
-rw-r--r--src/debug/pe/file.go17
-rw-r--r--src/debug/pe/file_test.go14
-rw-r--r--src/debug/pe/section.go6
3 files changed, 17 insertions, 20 deletions
diff --git a/src/debug/pe/file.go b/src/debug/pe/file.go
index de4bb9b736..06c160105f 100644
--- a/src/debug/pe/file.go
+++ b/src/debug/pe/file.go
@@ -20,6 +20,7 @@ import (
"compress/zlib"
"debug/dwarf"
"encoding/binary"
+ "errors"
"fmt"
"io"
"os"
@@ -165,7 +166,7 @@ func NewFile(r io.ReaderAt) (*File, error) {
}
r2 := r
if sh.PointerToRawData == 0 { // .bss must have all 0s
- r2 = zeroReaderAt{}
+ r2 = &nobitsSectionReader{}
}
s.sr = io.NewSectionReader(r2, int64(s.SectionHeader.Offset), int64(s.SectionHeader.Size))
s.ReaderAt = s.sr
@@ -182,15 +183,10 @@ func NewFile(r io.ReaderAt) (*File, error) {
return f, nil
}
-// zeroReaderAt is ReaderAt that reads 0s.
-type zeroReaderAt struct{}
+type nobitsSectionReader struct{}
-// ReadAt writes len(p) 0s into p.
-func (w zeroReaderAt) ReadAt(p []byte, off int64) (n int, err error) {
- for i := range p {
- p[i] = 0
- }
- return len(p), nil
+func (*nobitsSectionReader) ReadAt(p []byte, off int64) (n int, err error) {
+ return 0, errors.New("unexpected read from section with uninitialized data")
}
// getString extracts a string from symbol string table.
@@ -363,6 +359,9 @@ func (f *File) ImportedSymbols() ([]string, error) {
var ds *Section
ds = nil
for _, s := range f.Sections {
+ if s.Offset == 0 {
+ continue
+ }
// We are using distance between s.VirtualAddress and idd.VirtualAddress
// to avoid potential overflow of uint32 caused by addition of s.VirtualSize
// to s.VirtualAddress.
diff --git a/src/debug/pe/file_test.go b/src/debug/pe/file_test.go
index 5368e08ad7..3d960ab7f3 100644
--- a/src/debug/pe/file_test.go
+++ b/src/debug/pe/file_test.go
@@ -511,17 +511,9 @@ main(void)
if bss == nil {
t.Fatal("could not find .bss section")
}
- data, err := bss.Data()
- if err != nil {
- t.Fatal(err)
- }
- if len(data) == 0 {
- t.Fatalf("%s file .bss section cannot be empty", objpath)
- }
- for _, b := range data {
- if b != 0 {
- t.Fatalf(".bss section has non zero bytes: %v", data)
- }
+ // We expect an error from bss.Data, as there are no contents.
+ if _, err := bss.Data(); err == nil {
+ t.Error("bss.Data succeeded, expected error")
}
}
diff --git a/src/debug/pe/section.go b/src/debug/pe/section.go
index fabb47af2e..70d0c220ce 100644
--- a/src/debug/pe/section.go
+++ b/src/debug/pe/section.go
@@ -97,11 +97,17 @@ type Section struct {
}
// Data reads and returns the contents of the PE section s.
+//
+// If s.Offset is 0, the section has no contents,
+// and Data will always return a non-nil error.
func (s *Section) Data() ([]byte, error) {
return saferio.ReadDataAt(s.sr, uint64(s.Size), 0)
}
// Open returns a new ReadSeeker reading the PE section s.
+//
+// If s.Offset is 0, the section has no contents, and all calls
+// to the returned reader will return a non-nil error.
func (s *Section) Open() io.ReadSeeker {
return io.NewSectionReader(s.sr, 0, 1<<63-1)
}