From: Cherry Zhang Date: Wed, 29 Apr 2020 14:07:07 +0000 (-0400) Subject: [dev.link] cmd/link: fix R_GOTOFF handling X-Git-Tag: go1.15beta1~259^2^2~18 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=df2a46f85ad1e28076f639e3608ae9e2809f97a2;p=gostls13.git [dev.link] cmd/link: fix R_GOTOFF handling When applying relocations, we need to resolve ABI aliases. relocsym does that. Architecture-specific archreloc also needs to do that. The old code doesn't do that since ABI aliases are resolved in loadlibfull, or, in the old linker, in a much earlier stage. We don't do this in the new linker, as we want to avoid mutating relocations. While here, move R_CONST and R_GOTOFF handling to generic code. They appear on several architectures and the handling are same. Should fix 386-clang and *bsd-386 builds. Change-Id: I6681c94f0327555d6cf329d0a518c88848773671 Reviewed-on: https://go-review.googlesource.com/c/go/+/230857 Reviewed-by: Than McIntosh Reviewed-by: Jeremy Faller --- diff --git a/src/cmd/link/internal/ld/data.go b/src/cmd/link/internal/ld/data.go index d895c62f39..a4e9a4c1e8 100644 --- a/src/cmd/link/internal/ld/data.go +++ b/src/cmd/link/internal/ld/data.go @@ -528,6 +528,12 @@ func relocsym(target *Target, ldr *loader.Loader, err *ErrorReporter, syms *Arch case objabi.R_DWARFFILEREF: // We don't renumber files in dwarf.go:writelines anymore. continue + + case objabi.R_CONST: + o = r.Add() + + case objabi.R_GOTOFF: + o = ldr.SymValue(rs) + r.Add() - ldr.SymValue(syms.GOT2) } //if target.IsPPC64() || target.IsS390X() { diff --git a/src/cmd/link/internal/x86/asm.go b/src/cmd/link/internal/x86/asm.go index 4e31c4e8ea..0cf4009c4e 100644 --- a/src/cmd/link/internal/x86/asm.go +++ b/src/cmd/link/internal/x86/asm.go @@ -436,29 +436,6 @@ func pereloc1(arch *sys.Arch, out *ld.OutBuf, s *sym.Symbol, r *sym.Reloc, secto } 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 - } - switch r.Type { - case objabi.R_CONST: - return r.Add, true - case objabi.R_GOTOFF: - return ld.Symaddr(r.Sym) + r.Add - ld.Symaddr(syms.GOT), true - } - return val, false } diff --git a/src/cmd/link/internal/x86/obj.go b/src/cmd/link/internal/x86/obj.go index 8686d6ec18..06a1a6a96d 100644 --- a/src/cmd/link/internal/x86/obj.go +++ b/src/cmd/link/internal/x86/obj.go @@ -48,7 +48,6 @@ func Init() (*sys.Arch, ld.Arch) { Adddynrel2: adddynrel2, Archinit: archinit, - Archreloc: archreloc, Archreloc2: archreloc2, Archrelocvariant: archrelocvariant, Asmb: asmb,