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:
limeidan
2025-11-24 17:28:42 +08:00
committed by abner chenc
parent c6d64f8556
commit d8269ab0d5
2 changed files with 11 additions and 5 deletions

View File

@@ -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 {

View File

@@ -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