rs := r.Xsym
rt := r.Type
- if rt == objabi.R_PCREL || rt == objabi.R_GOTPCREL || rt == objabi.R_CALL || ldr.SymType(rs) == sym.SHOSTOBJ || ldr.SymType(s) == sym.SINITARR {
+ if !ldr.SymType(s).IsDWARF() {
if ldr.SymDynid(rs) < 0 {
ldr.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs))
return false
siz := r.Size
xadd := r.Xadd
- if xadd != signext24(xadd) {
+ if xadd != signext24(xadd) && rt != objabi.R_ADDR {
// If the relocation target would overflow the addend, then target
// a linker-manufactured label symbol with a smaller addend instead.
+ // R_ADDR has full-width addend encoded in data content, so it doesn't
+ // use a label symbol.
label := ldr.Lookup(offsetLabelName(ldr, rs, xadd/machoRelocLimit*machoRelocLimit), ldr.SymVersion(rs))
if label != 0 {
xadd = ldr.SymValue(rs) + xadd - ldr.SymValue(label)
}
}
- if rt == objabi.R_CALLARM64 ||
- rt == objabi.R_ARM64_PCREL_LDST8 || rt == objabi.R_ARM64_PCREL_LDST16 ||
- rt == objabi.R_ARM64_PCREL_LDST32 || rt == objabi.R_ARM64_PCREL_LDST64 ||
- rt == objabi.R_ADDRARM64 || rt == objabi.R_ARM64_GOTPCREL ||
- ldr.SymType(rs) == sym.SHOSTOBJ || ldr.SymType(s) == sym.SINITARR {
+ if !ldr.SymType(s).IsDWARF() {
if ldr.SymDynid(rs) < 0 {
ldr.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", rt, sym.RelocName(arch, rt), ldr.SymName(rs), ldr.SymType(rs), ldr.SymType(rs))
return false
o = 0
}
} else if target.IsDarwin() {
- if ldr.SymType(rs) != sym.SHOSTOBJ && ldr.SymType(s) != sym.SINITARR {
- // ld-prime drops the offset in data for SINITARR. We need to use
- // symbol-targeted relocation. See also machoreloc1.
+ if ldr.SymType(s).IsDWARF() {
+ // We generally use symbol-targeted relocations.
+ // DWARF tools seem to only handle section-targeted relocations,
+ // so generate section-targeted relocations in DWARF sections.
+ // See also machoreloc1.
o += ldr.SymValue(rs)
}
} else if target.IsWindows() {
func (t SymKind) IsData() bool {
return t == SDATA || t == SNOPTRDATA || t == SBSS || t == SNOPTRBSS
}
+
+func (t SymKind) IsDWARF() bool {
+ return t >= SDWARFSECT && t <= SDWARFLINES
+}