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
This commit is contained in:
Russ Cox 2013-03-21 17:01:39 -04:00
parent 3be703665e
commit aafc444b74
2 changed files with 14 additions and 24 deletions

View File

@ -258,28 +258,6 @@ TODO introduction
TODO
</p>
<h3 id="debug_elf">debug/elf</h3>
<p>
TODO: Decide whether to keep this change. See CL 6848044.
</p>
<p>
Previous versions of the <a href="/debug/elf/"><code>debug/elf</code></a> 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 <code>debug/elf</code>
will be different from indexes into the original ELF symbol table.
Any code that calls the methods
<a href="/pkg/debug/elf/#File.Symbols"><code>Symbols</code></a>
or
<a href="/pkg/debug/elf/#File.ImportedSymbols"><code>ImportedSymbols</code></a>
of the
<a href="/pkg/debug/elf/#File"><code>elf.File</code></a>
type may need to be adjusted to account for the additional symbol and the change in symbol offsets.
</p>
<h3 id="net">net</h3>
<p>

View File

@ -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