From: Cherry Mui Date: Thu, 8 Jun 2023 17:23:39 +0000 (-0400) Subject: cmd/link: clean up some relocation handling X-Git-Tag: go1.22rc1~1580 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=66c8410c7331edc2762bae3babb58e6e715eb066;p=gostls13.git cmd/link: clean up some relocation handling We don't use R_PCREL for calls to dynamic symbols (we use R_CALL instead). Don't handle R_PCREL as a call. We don't use R_CALL on ARM64 (we use R_CALLARM64 instead). Remove those cases, which we don't expect to see. Change-Id: Idd99022a8eeb65750ffc2936ffdccf8bb0405e30 Reviewed-on: https://go-review.googlesource.com/c/go/+/501859 Run-TryBot: Cherry Mui TryBot-Result: Gopher Robot Reviewed-by: Than McIntosh --- diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index c4134262c5..7082c839ee 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -245,13 +245,25 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade r = relocs.At(rIdx) switch r.Type() { - case objabi.R_CALL, - objabi.R_PCREL: + case objabi.R_CALL: if targType != sym.SDYNIMPORT { // nothing to do, the relocation will be laid out in reloc return true } - if r.Type() == objabi.R_PCREL && ldr.SymType(s) == sym.STEXT && target.IsDarwin() { + if target.IsExternal() { + // External linker will do this relocation. + return true + } + // Internal linking, for both ELF and Mach-O. + // Build a PLT entry and change the relocation target to that entry. + addpltsym(target, ldr, syms, targ) + su := ldr.MakeSymbolUpdater(s) + su.SetRelocSym(rIdx, syms.PLT) + su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) + return true + + case objabi.R_PCREL: + if targType == sym.SDYNIMPORT && ldr.SymType(s) == sym.STEXT && target.IsDarwin() { // Loading the address of a dynamic symbol. Rewrite to use GOT. // turn LEAQ symbol address to MOVQ of GOT entry if r.Add() != 0 { @@ -272,19 +284,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade return true } ldr.Errorf(s, "unexpected R_PCREL reloc for dynamic symbol %s: not preceded by LEAQ instruction", ldr.SymName(targ)) - return false - } - if target.IsExternal() { - // External linker will do this relocation. - return true } - // Internal linking, for both ELF and Mach-O. - // Build a PLT entry and change the relocation target to that entry. - addpltsym(target, ldr, syms, targ) - su := ldr.MakeSymbolUpdater(s) - su.SetRelocSym(rIdx, syms.PLT) - su.SetRelocAdd(rIdx, int64(ldr.SymPlt(targ))) - return true case objabi.R_ADDR: if ldr.SymType(s) == sym.STEXT && target.IsElf() { diff --git a/src/cmd/link/internal/arm64/asm.go b/src/cmd/link/internal/arm64/asm.go index e3fc1c4dd4..f2a2b32232 100644 --- a/src/cmd/link/internal/arm64/asm.go +++ b/src/cmd/link/internal/arm64/asm.go @@ -284,9 +284,7 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade r = relocs.At(rIdx) switch r.Type() { - case objabi.R_CALL, - objabi.R_PCREL, - objabi.R_CALLARM64: + case objabi.R_CALLARM64: if targType != sym.SDYNIMPORT { // nothing to do, the relocation will be laid out in reloc return true