mirror of
https://github.com/golang/go.git
synced 2026-02-05 02:15:06 +03:00
cmd/link, cmd/internal/obj: fix a remote call failure issue
When a function call exceeds the immediate value range of the instruction, a trampoline is required to assist in the jump. Trampoline is only omitted when plt is needed; otherwise, a check is required. Change-Id: I7fe2e08d75f6f574475837b560e650bbd4215858 Reviewed-on: https://go-review.googlesource.com/c/go/+/724580 Reviewed-by: abner chenc <chenguoqi@loongson.cn> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn> Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
@@ -2437,6 +2437,9 @@ func (c *ctxt0) asmout(p *obj.Prog, o *Optab, out []uint32) {
|
||||
v := int32(0)
|
||||
if p.To.Target() != nil {
|
||||
v = int32(p.To.Target().Pc-p.Pc) >> 2
|
||||
if v < -1<<25 || v >= 1<<25 {
|
||||
c.ctxt.Diag("branch too far \n%v", p)
|
||||
}
|
||||
}
|
||||
o1 = OP_B_BL(c.opirr(p.As), uint32(v))
|
||||
if p.To.Sym != nil {
|
||||
|
||||
@@ -643,11 +643,14 @@ func trampoline(ctxt *ld.Link, ldr *loader.Loader, ri int, rs, s loader.Sym) {
|
||||
relocs := ldr.Relocs(s)
|
||||
r := relocs.At(ri)
|
||||
switch r.Type() {
|
||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26):
|
||||
// Nothing to do.
|
||||
// The plt symbol has not been added. If we add tramp
|
||||
// here, plt will not work.
|
||||
case objabi.R_CALLLOONG64:
|
||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26), objabi.R_CALLLOONG64:
|
||||
if ldr.SymType(rs) == sym.SDYNIMPORT {
|
||||
// Nothing to do.
|
||||
// The plt symbol has not been added. If we add tramp
|
||||
// here, plt will not work.
|
||||
return
|
||||
}
|
||||
|
||||
var t int64
|
||||
// ldr.SymValue(rs) == 0 indicates a cross-package jump to a function that is not yet
|
||||
// laid out. Conservatively use a trampoline. This should be rare, as we lay out packages
|
||||
|
||||
Reference in New Issue
Block a user