aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/debug/elf/elf_test.go22
-rw-r--r--src/debug/elf/file.go12
2 files changed, 34 insertions, 0 deletions
diff --git a/src/debug/elf/elf_test.go b/src/debug/elf/elf_test.go
index a61b491090..b8c310dba5 100644
--- a/src/debug/elf/elf_test.go
+++ b/src/debug/elf/elf_test.go
@@ -47,3 +47,25 @@ func TestNames(t *testing.T) {
}
}
}
+
+func TestNobitsSection(t *testing.T) {
+ const testdata = "testdata/gcc-amd64-linux-exec"
+ f, err := Open(testdata)
+ if err != nil {
+ t.Fatalf("could not read %s: %v", testdata, err)
+ }
+ defer f.Close()
+ bss := f.Section(".bss")
+ bssData, err := bss.Data()
+ if err != nil {
+ t.Fatalf("error reading .bss section: %v", err)
+ }
+ if g, w := uint64(len(bssData)), bss.Size; g != w {
+ t.Errorf(".bss section length mismatch: got %d, want %d", g, w)
+ }
+ for i := range bssData {
+ if bssData[i] != 0 {
+ t.Fatalf("unexpected non-zero byte at offset %d: %#x", i, bssData[i])
+ }
+ }
+}
diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go
index eefcaab8d6..8c84661c5f 100644
--- a/src/debug/elf/file.go
+++ b/src/debug/elf/file.go
@@ -120,6 +120,9 @@ func (f *File) stringTable(link uint32) ([]byte, error) {
// Even if the section is stored compressed in the ELF file,
// the ReadSeeker reads uncompressed data.
func (s *Section) Open() io.ReadSeeker {
+ if s.Type == SHT_NOBITS {
+ return io.NewSectionReader(&zeroReader{}, 0, int64(s.Size))
+ }
if s.Flags&SHF_COMPRESSED == 0 {
return io.NewSectionReader(s.sr, 0, 1<<63-1)
}
@@ -1453,3 +1456,12 @@ func (f *File) DynString(tag DynTag) ([]string, error) {
}
return all, nil
}
+
+type zeroReader struct{}
+
+func (*zeroReader) ReadAt(p []byte, off int64) (n int, err error) {
+ for i := range p {
+ p[i] = 0
+ }
+ return len(p), nil
+}