diff options
author | Russ Cox <rsc@golang.org> | 2014-05-14 17:45:13 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2014-05-14 17:45:13 -0700 |
commit | 68773c7adfd19ff5a1b5d20ff44c8fe8058bf6ca (patch) | |
tree | 794fbe55d50180f1b6b1729812b15d8ddd916a86 /src | |
parent | efbc486d2bd5530e438aeea4b97d59584a1d1b90 (diff) | |
download | go-68773c7adfd19ff5a1b5d20ff44c8fe8058bf6ca.tar.gz |
cmd/nm, cmd/objdump: fix elf symbol types
Turns out elf.File.Sections is indexed by the actual
section number, not the number minus one.
I don't know why I thought the -1 was necessary.
Fixes objdump test (and therefore build) on ELF systems.
While we're here, fix bounds on gnuDump so that we
don't crash when asked to disassemble outside
the text segment. May fix Windows build or at least
make the failure more interesting.
TBR=iant
CC=golang-codereviews
https://codereview.appspot.com/92390043
Diffstat (limited to 'src')
-rw-r--r-- | src/cmd/nm/elf.go | 4 | ||||
-rw-r--r-- | src/cmd/objdump/elf.go | 4 | ||||
-rw-r--r-- | src/cmd/objdump/main.go | 9 |
3 files changed, 13 insertions, 4 deletions
diff --git a/src/cmd/nm/elf.go b/src/cmd/nm/elf.go index 58a4b556f..5aaa194dd 100644 --- a/src/cmd/nm/elf.go +++ b/src/cmd/nm/elf.go @@ -34,10 +34,10 @@ func elfSymbols(f *os.File) []Sym { sym.Code = 'B' default: i := int(s.Section) - if i <= 0 || i > len(p.Sections) { + if i < 0 || i >= len(p.Sections) { break } - sect := p.Sections[i-1] + sect := p.Sections[i] switch sect.Flags & (elf.SHF_WRITE | elf.SHF_ALLOC | elf.SHF_EXECINSTR) { case elf.SHF_ALLOC | elf.SHF_EXECINSTR: sym.Code = 'T' diff --git a/src/cmd/objdump/elf.go b/src/cmd/objdump/elf.go index 017c2034e..906e90353 100644 --- a/src/cmd/objdump/elf.go +++ b/src/cmd/objdump/elf.go @@ -42,10 +42,10 @@ func elfSymbols(f *os.File) (syms []Sym, goarch string) { sym.Code = 'B' default: i := int(s.Section) - if i <= 0 || i > len(p.Sections) { + if i < 0 || i >= len(p.Sections) { break } - sect := p.Sections[i-1] + sect := p.Sections[i] switch sect.Flags & (elf.SHF_WRITE | elf.SHF_ALLOC | elf.SHF_EXECINSTR) { case elf.SHF_ALLOC | elf.SHF_EXECINSTR: sym.Code = 'T' diff --git a/src/cmd/objdump/main.go b/src/cmd/objdump/main.go index 62cbdec90..1b6b3d0fc 100644 --- a/src/cmd/objdump/main.go +++ b/src/cmd/objdump/main.go @@ -235,6 +235,15 @@ func gnuDump(tab *gosym.Table, lookup lookupFunc, disasm disasmFunc, textData [] if err != nil { log.Fatalf("invalid end PC: %v", err) } + if start < textStart { + start = textStart + } + if end < start { + end = start + } + if end > textStart+uint64(len(textData)) { + end = textStart + uint64(len(textData)) + } stdout := bufio.NewWriter(os.Stdout) defer stdout.Flush() |