Skip to content

Commit

Permalink
cmd/link: remove R_ADDR relocation workaround for macho arm64
Browse files Browse the repository at this point in the history
The workarounds doesn't seem necessary anymore, and blocks DWARF
on darwin/arm64.

Updates golang#24883.

Change-Id: Ic917c767d3b4f6c51be25566956296f5dd4ead10
Reviewed-on: https://go-review.googlesource.com/108655
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Cherry Zhang <[email protected]>
  • Loading branch information
Elias Naur committed Apr 23, 2018
1 parent 1f71892 commit 3363e98
Show file tree
Hide file tree
Showing 2 changed files with 2 additions and 15 deletions.
5 changes: 1 addition & 4 deletions src/cmd/link/internal/arm64/asm.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,10 +150,7 @@ func machoreloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, se

rs := r.Xsym

// ld64 has a bug handling MACHO_ARM64_RELOC_UNSIGNED with !extern relocation.
// see cmd/internal/ld/data.go for details. The workaround is that don't use !extern
// UNSIGNED relocation at all.
if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 || r.Type == objabi.R_ADDR {
if rs.Type == sym.SHOSTOBJ || r.Type == objabi.R_CALLARM64 || r.Type == objabi.R_ADDRARM64 {
if rs.Dynid < 0 {
ld.Errorf(s, "reloc %d (%s) to non-macho symbol %s type=%d (%s)", r.Type, sym.RelocName(arch, r.Type), rs.Name, rs.Type, rs.Type)
return false
Expand Down
12 changes: 1 addition & 11 deletions src/cmd/link/internal/ld/data.go
Original file line number Diff line number Diff line change
Expand Up @@ -285,18 +285,8 @@ func relocsym(ctxt *Link, s *sym.Symbol) {
o = 0
}
} else if ctxt.HeadType == objabi.Hdarwin {
// ld64 for arm64 has a bug where if the address pointed to by o exists in the
// symbol table (dynid >= 0), or is inside a symbol that exists in the symbol
// table, then it will add o twice into the relocated value.
// The workaround is that on arm64 don't ever add symaddr to o and always use
// extern relocation by requiring rs->dynid >= 0.
if rs.Type != sym.SHOSTOBJ {
if ctxt.Arch.Family == sys.ARM64 && rs.Dynid < 0 {
Errorf(s, "R_ADDR reloc to %s+%d is not supported on darwin/arm64", rs.Name, o)
}
if ctxt.Arch.Family != sys.ARM64 {
o += Symaddr(rs)
}
o += Symaddr(rs)
}
} else if ctxt.HeadType == objabi.Hwindows {
// nothing to do
Expand Down

0 comments on commit 3363e98

Please sign in to comment.