From: Russ Cox Date: Thu, 15 May 2014 00:45:13 +0000 (-0700) Subject: cmd/nm, cmd/objdump: fix elf symbol types X-Git-Tag: go1.3beta2~63 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8e22903b46aadd6eda937417cba86b528cba92e2;p=gostls13.git 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://golang.org/cl/92390043 --- diff --git a/src/cmd/nm/elf.go b/src/cmd/nm/elf.go index 58a4b556f3..5aaa194dd1 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 017c2034e5..906e903532 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 62cbdec90d..1b6b3d0fc4 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()