diff options
-rw-r--r-- | src/debug/elf/elf_test.go | 22 | ||||
-rw-r--r-- | src/debug/elf/file.go | 12 |
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 +} |