mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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 <joel@sing.id.au> Run-TryBot: Cherry Zhang <cherryyz@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
f3741bdf7c
commit
a36ba090fd
1 changed files with 1 additions and 5 deletions
|
|
@ -413,11 +413,7 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
|
||||||
case objabi.R_CALL:
|
case objabi.R_CALL:
|
||||||
if siz == 4 {
|
if siz == 4 {
|
||||||
if ldr.SymType(r.Xsym) == sym.SDYNIMPORT {
|
if ldr.SymType(r.Xsym) == sym.SDYNIMPORT {
|
||||||
if ctxt.DynlinkingGo() {
|
out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32)
|
||||||
out.Write64(uint64(elf.R_X86_64_PLT32) | uint64(elfsym)<<32)
|
|
||||||
} else {
|
|
||||||
out.Write64(uint64(elf.R_X86_64_GOTPCREL) | uint64(elfsym)<<32)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_X86_64_PC32) | uint64(elfsym)<<32)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue