}
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) {
- rs := ldr.ResolveABIAlias(r.Sym())
- var rr loader.ExtReloc
switch rt := r.Type(); rt {
case objabi.R_ARM64_GOTPCREL,
objabi.R_ADDRARM64:
-
- // set up addend for eventual relocation via outer symbol.
- rs, off := ld.FoldSubSymbolOffset(ldr, rs)
- rr.Xadd = r.Add() + off
- rr.Xsym = rs
+ rr := ld.ExtrelocViaOuterSym(ldr, r, s)
// Note: ld64 currently has a bug that any non-zero addend for BR26 relocation
// will make the linking fail because it thinks the code is not PIC even though
case objabi.R_CALLARM64,
objabi.R_ARM64_TLS_LE,
objabi.R_ARM64_TLS_IE:
- rr.Xsym = rs
- rr.Xadd = r.Add()
- return rr, true
+ return ld.ExtrelocSimple(ldr, r), true
}
- return rr, false
+ return loader.ExtReloc{}, false
}
func elfsetupplt(ctxt *ld.Link, plt, gotplt *loader.SymbolBuilder, dynamic loader.Sym) {
return rr, false
case objabi.R_XCOFFREF:
- rs := ldr.ResolveABIAlias(r.Sym())
- rr.Xsym = rs
- rr.Xadd = r.Add()
+ return ExtrelocSimple(ldr, r), true
// These reloc types don't need external relocations.
case objabi.R_ADDROFF, objabi.R_WEAKADDROFF, objabi.R_METHODOFF, objabi.R_ADDRCUOFF,
return rr, true
}
+// ExtrelocSimple creates a simple external relocation from r, with the same
+// symbol and addend.
+func ExtrelocSimple(ldr *loader.Loader, r loader.Reloc2) loader.ExtReloc {
+ var rr loader.ExtReloc
+ rs := ldr.ResolveABIAlias(r.Sym())
+ rr.Xsym = rs
+ rr.Xadd = r.Add()
+ return rr
+}
+
+// ExtrelocViaOuterSym creates an external relocation from r targeting the
+// outer symbol and folding the subsymbol's offset into the addend.
+func ExtrelocViaOuterSym(ldr *loader.Loader, r loader.Reloc2, s loader.Sym) loader.ExtReloc {
+ // set up addend for eventual relocation via outer symbol.
+ var rr loader.ExtReloc
+ rs, off := FoldSubSymbolOffset(ldr, r.Sym())
+ rr.Xadd = r.Add() + off
+ rst := ldr.SymType(rs)
+ if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
+ ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
+ }
+ rr.Xsym = rs
+ return rr
+}
+
// relocSymState hold state information needed when making a series of
// successive calls to relocsym(). The items here are invariant
// (meaning that they are set up once initially and then don't change
}
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) {
- rs := ldr.ResolveABIAlias(r.Sym())
- var rr loader.ExtReloc
switch r.Type() {
case objabi.R_ADDRMIPS, objabi.R_ADDRMIPSU:
- // set up addend for eventual relocation via outer symbol.
- rs, off := ld.FoldSubSymbolOffset(ldr, rs)
- rr.Xadd = r.Add() + off
- rst := ldr.SymType(rs)
- if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
- ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
- }
- rr.Xsym = rs
- return rr, true
+ return ld.ExtrelocViaOuterSym(ldr, r, s), true
case objabi.R_ADDRMIPSTLS, objabi.R_CALLMIPS, objabi.R_JMPMIPS:
- rr.Xsym = rs
- rr.Xadd = r.Add()
- return rr, true
+ return ld.ExtrelocSimple(ldr, r), true
}
- return rr, false
+ return loader.ExtReloc{}, false
}
}
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) {
- rs := ldr.ResolveABIAlias(r.Sym())
- var rr loader.ExtReloc
switch r.Type() {
case objabi.R_ADDRMIPS,
objabi.R_ADDRMIPSU:
- // set up addend for eventual relocation via outer symbol.
- rs, off := ld.FoldSubSymbolOffset(ldr, rs)
- rr.Xadd = r.Add() + off
- rst := ldr.SymType(rs)
- if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && ldr.SymSect(rs) == nil {
- ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
- }
- rr.Xsym = rs
- return rr, true
+ return ld.ExtrelocViaOuterSym(ldr, r, s), true
case objabi.R_ADDRMIPSTLS,
objabi.R_CALLMIPS,
objabi.R_JMPMIPS:
- rr.Xsym = rs
- rr.Xadd = r.Add()
- return rr, true
+ return ld.ExtrelocSimple(ldr, r), true
}
- return rr, false
+ return loader.ExtReloc{}, false
}
}
func extreloc(target *ld.Target, ldr *loader.Loader, r loader.Reloc2, s loader.Sym) (loader.ExtReloc, bool) {
- rs := ldr.ResolveABIAlias(r.Sym())
- var rr loader.ExtReloc
switch r.Type() {
- case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE:
- rr.Xadd = r.Add()
- rr.Xsym = rs
- return rr, true
+ case objabi.R_POWER_TLS, objabi.R_POWER_TLS_LE, objabi.R_POWER_TLS_IE, objabi.R_CALLPOWER:
+ return ld.ExtrelocSimple(ldr, r), true
case objabi.R_ADDRPOWER,
objabi.R_ADDRPOWER_DS,
objabi.R_ADDRPOWER_TOCREL,
objabi.R_ADDRPOWER_TOCREL_DS,
objabi.R_ADDRPOWER_GOT,
objabi.R_ADDRPOWER_PCREL:
- // set up addend for eventual relocation via outer symbol.
- rs, off := ld.FoldSubSymbolOffset(ldr, rs)
- rr.Xadd = r.Add() + off
- rst := ldr.SymType(rs)
- if rst != sym.SHOSTOBJ && rst != sym.SDYNIMPORT && rst != sym.SUNDEFEXT && ldr.SymSect(rs) == nil {
- ldr.Errorf(s, "missing section for %s", ldr.SymName(rs))
- }
- rr.Xsym = rs
- return rr, true
- case objabi.R_CALLPOWER:
- rr.Xsym = rs
- rr.Xadd = r.Add()
- return rr, true
+ return ld.ExtrelocViaOuterSym(ldr, r, s), true
}
- return rr, false
+ return loader.ExtReloc{}, false
}
func addpltsym(ctxt *ld.Link, ldr *loader.Loader, s loader.Sym) {