aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlessandro Arzilli <alessandro.arzilli@gmail.com>2022-01-04 15:47:02 +0100
committerIan Lance Taylor <iant@golang.org>2022-01-14 18:20:45 +0000
commite4a6b84962cc2fb4f4b8bb532a84bab5bfd68d99 (patch)
treeaf7c8a53aae529f16a466cd5939d1b541ffa5a59
parent9c6ecc49ca02c83f3081c30171ab40dd62557342 (diff)
downloadgo-e4a6b84962cc2fb4f4b8bb532a84bab5bfd68d99.tar.gz
go-e4a6b84962cc2fb4f4b8bb532a84bab5bfd68d99.zip
debug/elf: do not read unrelated bytes for SHT_NOBITS sections
SHT_NOBITS sections do not occupy space in the file and their offset is "conceptual", reading their data should return all zeroes instead of reading bytes from the section that follows them. Change-Id: Iaa9634792c1909c3e87dab841dd646cd6dcf9027 Reviewed-on: https://go-review.googlesource.com/c/go/+/375216 Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com> Run-TryBot: Emmanuel Odeke <emmanuel@orijtech.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
-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 a61b491090d..b8c310dba55 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 eefcaab8d69..8c84661c5f7 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
+}