Commit eafa7a90 by Ian Lance Taylor

debug/elf: support 32-bit SPARC relocs

    
    Patch by Rainer Orth.
    
    Reviewed-on: https://go-review.googlesource.com/67111

From-SVN: r253292
parent 03907394
9a9d526a4c0a7f5b3635034b3e1dc3bbe6380dd2 5989ef1cd0add98f107839759a5bc57f34354d39
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -600,6 +600,8 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error { ...@@ -600,6 +600,8 @@ func (f *File) applyRelocations(dst []byte, rels []byte) error {
return f.applyRelocationsMIPS64(dst, rels) return f.applyRelocationsMIPS64(dst, rels)
case f.Class == ELFCLASS64 && f.Machine == EM_S390: case f.Class == ELFCLASS64 && f.Machine == EM_S390:
return f.applyRelocationss390x(dst, rels) return f.applyRelocationss390x(dst, rels)
case f.Class == ELFCLASS32 && (f.Machine == EM_SPARC || f.Machine == EM_SPARC32PLUS):
return f.applyRelocationsSPARC(dst, rels)
case f.Class == ELFCLASS64 && f.Machine == EM_SPARCV9: case f.Class == ELFCLASS64 && f.Machine == EM_SPARCV9:
return f.applyRelocationsSPARC64(dst, rels) return f.applyRelocationsSPARC64(dst, rels)
case f.Class == ELFCLASS64 && f.Machine == EM_ALPHA: case f.Class == ELFCLASS64 && f.Machine == EM_ALPHA:
...@@ -1006,6 +1008,46 @@ func (f *File) applyRelocationss390x(dst []byte, rels []byte) error { ...@@ -1006,6 +1008,46 @@ func (f *File) applyRelocationss390x(dst []byte, rels []byte) error {
return nil return nil
} }
func (f *File) applyRelocationsSPARC(dst []byte, rels []byte) error {
// 12 is the size of Rela32.
if len(rels)%12 != 0 {
return errors.New("length of relocation section is not a multiple of 12")
}
symbols, _, err := f.getSymbols(SHT_SYMTAB)
if err != nil {
return err
}
b := bytes.NewReader(rels)
var rela Rela32
for b.Len() > 0 {
binary.Read(b, f.ByteOrder, &rela)
symNo := rela.Info >> 32
t := R_SPARC(rela.Info & 0xff)
if symNo == 0 || symNo > uint32(len(symbols)) {
continue
}
sym := &symbols[symNo-1]
if SymType(sym.Info&0xf) != STT_SECTION {
// We don't handle non-section relocations for now.
continue
}
switch t {
case R_SPARC_32, R_SPARC_UA32:
if rela.Off+4 >= uint32(len(dst)) || rela.Addend < 0 {
continue
}
f.ByteOrder.PutUint32(dst[rela.Off:rela.Off+4], uint32(rela.Addend))
}
}
return nil
}
func (f *File) applyRelocationsSPARC64(dst []byte, rels []byte) error { func (f *File) applyRelocationsSPARC64(dst []byte, rels []byte) error {
// 24 is the size of Rela64. // 24 is the size of Rela64.
if len(rels)%24 != 0 { if len(rels)%24 != 0 {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment