From: Russ Cox Date: Thu, 21 Mar 2013 21:01:39 +0000 (-0400) Subject: debug/elf: restore Go 1.0 semantics for (*File).Symbols X-Git-Tag: go1.1rc2~399 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=aafc444b74ba2a4dc56e6d5d26f8242f0857856a;p=gostls13.git debug/elf: restore Go 1.0 semantics for (*File).Symbols Also adjust the implementation of applyRelocationsAMD64 so that the test added in CL 6848044 still passes. R=golang-dev, minux.ma CC=golang-dev https://golang.org/cl/7686049 --- diff --git a/doc/go1.1.html b/doc/go1.1.html index df495ee81e..31d6d9b020 100644 --- a/doc/go1.1.html +++ b/doc/go1.1.html @@ -258,28 +258,6 @@ TODO introduction TODO

-

debug/elf

- -

-TODO: Decide whether to keep this change. See CL 6848044. -

- -

-Previous versions of the debug/elf package -intentionally skipped over the first -symbol in the ELF symbol table, since it is always an empty symbol. -This symbol -is no longer skipped since indexes into the symbol table returned by debug/elf -will be different from indexes into the original ELF symbol table. -Any code that calls the methods -Symbols -or -ImportedSymbols -of the -elf.File -type may need to be adjusted to account for the additional symbol and the change in symbol offsets. -

-

net

diff --git a/src/pkg/debug/elf/file.go b/src/pkg/debug/elf/file.go index acb9817af0..0d022ab910 100644 --- a/src/pkg/debug/elf/file.go +++ b/src/pkg/debug/elf/file.go @@ -422,6 +422,10 @@ func (f *File) getSymbols32(typ SectionType) ([]Symbol, []byte, error) { return nil, nil, errors.New("cannot load string table section") } + // The first entry is all zeros. + var skip [Sym32Size]byte + symtab.Read(skip[:]) + symbols := make([]Symbol, symtab.Len()/Sym32Size) i := 0 @@ -461,6 +465,10 @@ func (f *File) getSymbols64(typ SectionType) ([]Symbol, []byte, error) { return nil, nil, errors.New("cannot load string table section") } + // The first entry is all zeros. + var skip [Sym64Size]byte + symtab.Read(skip[:]) + symbols := make([]Symbol, symtab.Len()/Sym64Size) i := 0 @@ -533,10 +541,10 @@ func (f *File) applyRelocationsAMD64(dst []byte, rels []byte) error { symNo := rela.Info >> 32 t := R_X86_64(rela.Info & 0xffff) - if symNo >= uint64(len(symbols)) { + if symNo == 0 || symNo > uint64(len(symbols)) { continue } - sym := &symbols[symNo] + sym := &symbols[symNo-1] if SymType(sym.Info&0xf) != STT_SECTION { // We don't handle non-section relocations for now. continue @@ -597,6 +605,10 @@ func (f *File) DWARF() (*dwarf.Data, error) { } // Symbols returns the symbol table for f. +// +// For compatibility with Go 1.0, Symbols omits the null symbol at index 0. +// After retrieving the symbols as symtab, an externally supplied index x +// corresponds to symtab[x-1], not symtab[x]. func (f *File) Symbols() ([]Symbol, error) { sym, _, err := f.getSymbols(SHT_SYMTAB) return sym, err