"compress/zlib"
"debug/dwarf"
"encoding/binary"
+ "errors"
"fmt"
"io"
"os"
}
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
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.
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.
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")
}
}
}
// 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)
}