]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.link] cmd/link: fix R_GOTOFF handling
authorCherry Zhang <cherryyz@google.com>
Wed, 29 Apr 2020 14:07:07 +0000 (10:07 -0400)
committerCherry Zhang <cherryyz@google.com>
Wed, 29 Apr 2020 15:32:58 +0000 (15:32 +0000)
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 <thanm@google.com>
Reviewed-by: Jeremy Faller <jeremy@golang.org>
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/x86/asm.go
src/cmd/link/internal/x86/obj.go

index d895c62f392815abbc158e5da338b309b9bb9611..a4e9a4c1e88db610adcbb9a88ef6cafa9cbba713 100644 (file)
@@ -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() {
index 4e31c4e8ea4fe438f2d30b41867370eec275eaa6..0cf4009c4e9cf65804b2e9f706659344eda73955 100644 (file)
@@ -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
 }
 
index 8686d6ec18643ce6b8ffc946b46e1f7831fa3498..06a1a6a96d234ca419416d65622a9953c9f103b5 100644 (file)
@@ -48,7 +48,6 @@ func Init() (*sys.Arch, ld.Arch) {
 
                Adddynrel2:       adddynrel2,
                Archinit:         archinit,
-               Archreloc:        archreloc,
                Archreloc2:       archreloc2,
                Archrelocvariant: archrelocvariant,
                Asmb:             asmb,