var o int64
switch rt {
default:
- panic("not implemented")
- //switch siz {
- //default:
- // err.Errorf(s, "bad reloc size %#x for %s", uint32(siz), ldr.SymName(rs))
- //case 1:
- // o = int64(P[off])
- //case 2:
- // o = int64(target.Arch.ByteOrder.Uint16(P[off:]))
- //case 4:
- // o = int64(target.Arch.ByteOrder.Uint32(P[off:]))
- //case 8:
- // o = int64(target.Arch.ByteOrder.Uint64(P[off:]))
- //}
- //if out, ok := thearch.Archreloc(ldr, target, syms, &r, s, o); ok {
- // o = out
- //} else {
- // err.Errorf(s, "unknown reloc to %v: %d (%s)", ldr.SymName(rs), rt, sym.RelocName(target.Arch, rt))
- //}
+ switch siz {
+ default:
+ err.Errorf(s, "bad reloc size %#x for %s", uint32(siz), ldr.SymName(rs))
+ case 1:
+ o = int64(P[off])
+ case 2:
+ o = int64(target.Arch.ByteOrder.Uint16(P[off:]))
+ case 4:
+ o = int64(target.Arch.ByteOrder.Uint32(P[off:]))
+ case 8:
+ o = int64(target.Arch.ByteOrder.Uint64(P[off:]))
+ }
+ if out, ok := thearch.Archreloc2(target, ldr, syms, &r, s, o); ok {
+ o = out
+ } else {
+ err.Errorf(s, "unknown reloc to %v: %d (%s)", ldr.SymName(rs), rt, sym.RelocName(target.Arch, rt))
+ }
case objabi.R_TLS_LE:
//if target.IsExternal() && target.IsElf() {
// r.Done = false
// success/failure (a failing value indicates a fatal error).
Archreloc func(target *Target, syms *ArchSyms, rel *sym.Reloc, sym *sym.Symbol,
offset int64) (relocatedOffset int64, success bool)
+ Archreloc2 func(*Target, *loader.Loader, *ArchSyms, *loader.Reloc2, loader.Sym, int64) (int64, bool)
// Archrelocvariant is a second arch-specific hook used for
// relocation processing; it handles relocations where r.Type is
// insufficient to describe the relocation (r.Variant !=
return true
}
+func archreloc2(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r *loader.Reloc2, sym loader.Sym, val int64) (int64, bool) {
+ if target.IsExternal() {
+ return val, false
+ }
+ switch r.Type() {
+ case objabi.R_CONST:
+ return r.Add(), true
+ case objabi.R_GOTOFF:
+ return ldr.SymValue(r.Sym()) + r.Add() - ldr.SymValue(syms.GOT2), true
+ }
+ return val, false
+}
+
func archreloc(target *ld.Target, syms *ld.ArchSyms, r *sym.Reloc, s *sym.Symbol, val int64) (int64, bool) {
if target.IsExternal() {
return val, false