// set up addend for eventual relocation via outer symbol.
rs := r.Sym
-
r.Xadd = int64(signext24(r.Add & 0xffffff))
r.Xadd *= 4
- for rs.Outer != nil {
+ if rs.Outer != nil {
r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer)
rs = rs.Outer
}
-
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil {
ld.Errorf(s, "missing section for %s", rs.Name)
}
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ld.ApplyOuterToXAdd(r)
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil {
ld.Errorf(s, "missing section for %s", rs.Name)
}
func foldSubSymbolOffset(ldr *loader.Loader, s loader.Sym) (loader.Sym, int64) {
outer := ldr.OuterSym(s)
off := int64(0)
- for outer != 0 {
+ if outer != 0 {
off += ldr.SymValue(s) - ldr.SymValue(outer)
s = outer
- outer = ldr.OuterSym(s)
}
return s, off
}
+// applyOuterToXAdd takes a relocation and updates the relocation's
+// XAdd field to take into account the target syms's outer symbol (if
+// applicable).
+func ApplyOuterToXAdd(r *sym.Reloc) *sym.Symbol {
+ rs := r.Sym
+ r.Xadd = r.Add
+ if rs.Outer != nil {
+ r.Xadd += Symaddr(rs) - Symaddr(rs.Outer)
+ rs = rs.Outer
+ }
+ return rs
+}
+
// relocsym resolve relocations in "s", updating the symbol's content
// in "P".
// The main loop walks through the list of relocations attached to "s"
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
-
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += Symaddr(rs) - Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ApplyOuterToXAdd(r)
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil {
Errorf(s, "missing section for relocation target %s", rs.Name)
}
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
-
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += Symaddr(rs) - Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ApplyOuterToXAdd(r)
r.Xadd -= int64(r.Siz) // relative to address after the relocated chunk
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil {
Errorf(s, "missing section for relocation target %s", rs.Name)
}
xo := x
- for xo.Outer != nil {
+ if xo.Outer != nil {
xo = xo.Outer
}
func (l *Loader) SetOuterSym(i Sym, o Sym) {
if o != 0 {
l.outer[i] = o
+ // relocsym's foldSubSymbolOffset requires that we only
+ // have a single level of containment-- enforce here.
+ if l.outer[o] != 0 {
+ panic("multiply nested outer sym")
+ }
} else {
delete(l.outer, i)
}
// Convert outer relationship
if outer, ok := l.outer[src]; ok {
dst.Outer = l.Syms[outer]
+ // relocsym's foldSubSymbolOffset requires that we only
+ // have a single level of containment-- enforce here.
+ if l.outer[outer] != 0 {
+ panic("multiply nested outer syms")
+ }
}
// Set sub-symbol attribute. See the comment on the AttrSubSymbol
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ld.ApplyOuterToXAdd(r)
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil {
ld.Errorf(s, "missing section for %s", rs.Name)
}
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ld.ApplyOuterToXAdd(r)
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Sect == nil {
ld.Errorf(s, "missing section for %s", rs.Name)
}
r.Done = false
// set up addend for eventual relocation via outer symbol.
- rs := r.Sym
- r.Xadd = r.Add
- for rs.Outer != nil {
- r.Xadd += ld.Symaddr(rs) - ld.Symaddr(rs.Outer)
- rs = rs.Outer
- }
-
+ rs := ld.ApplyOuterToXAdd(r)
if rs.Type != sym.SHOSTOBJ && rs.Type != sym.SDYNIMPORT && rs.Type != sym.SUNDEFEXT && rs.Sect == nil {
ld.Errorf(s, "missing section for %s", rs.Name)
}