From: Joel Sing Date: Thu, 26 Nov 2020 15:06:08 +0000 (+1100) Subject: cmd/link/internal/amd64: always generate R_X86_64_PLT32 for SDYNIMPORT calls X-Git-Tag: go1.16beta1~136 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a36ba090fd647e741668629527e25c657c40f8f3;p=gostls13.git cmd/link/internal/amd64: always generate R_X86_64_PLT32 for SDYNIMPORT calls Currently, in the non-DynlinkingGo case with external linking, we generate a R_X86_64_GOTPCREL relocation for the imported symbol. This results in the external linker turning this into a R_X86_64_GLOB_DAT relocation, rather than a R_X86_64_JUMP_SLOT. Always generate R_X86_64_PLT32 for SDYNIMPORT calls so that these calls work correctly. Update #36435 Fixes #42671 Change-Id: I8a28884b7853cb4135053ed817bedc919482f4ad Reviewed-on: https://go-review.googlesource.com/c/go/+/270377 Trust: Joel Sing Run-TryBot: Cherry Zhang Reviewed-by: Cherry Zhang --- diff --git a/src/cmd/link/internal/amd64/asm.go b/src/cmd/link/internal/amd64/asm.go index 360c5338ba..2d09a6160a 100644 --- a/src/cmd/link/internal/amd64/asm.go +++ b/src/cmd/link/internal/amd64/asm.go @@ -413,11 +413,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym, case objabi.R_CALL: if siz == 4 { if ldr.SymType(r.Xsym) == sym.SDYNIMPORT { - if ctxt.DynlinkingGo() { - out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) - } else { - out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32) - } + out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32) } else { out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32) }