mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/link: support loading R_LARCH_PCREL20_S2 and R_LARCH_CALL36 relocs
Host libgcc.a (among other libraries) on loong64 systems may contain such relocs if built with the "medium" code model and/or linker relaxation, which is increasingly the case. Make the internal linker aware of these for cgo interopability going forward. While at it, fix some of the comments for the loong64-specific RelocTypes. Fixes #75562 Change-Id: I0810969dcd229c5131ef06b0f70f51d81a3be4cd Reviewed-on: https://go-review.googlesource.com/c/go/+/709717 Reviewed-by: abner chenc <chenguoqi@loongson.cn> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Mark Freeman <markfreeman@google.com> Reviewed-by: Meidan Li <limeidan@loongson.cn> Reviewed-by: Junyang Shao <shaojunyang@google.com>
This commit is contained in:
parent
cdba82c7d6
commit
4b0e3cc1d6
5 changed files with 96 additions and 44 deletions
|
|
@ -354,8 +354,10 @@ func (s *LSym) checkFIPSReloc(ctxt *Link, rel Reloc) {
|
||||||
objabi.R_CALLLOONG64,
|
objabi.R_CALLLOONG64,
|
||||||
objabi.R_CALLPOWER,
|
objabi.R_CALLPOWER,
|
||||||
objabi.R_GOTPCREL,
|
objabi.R_GOTPCREL,
|
||||||
objabi.R_LOONG64_ADDR_LO, // used with PC-relative load
|
objabi.R_LOONG64_ADDR_LO, // used with PC-relative load
|
||||||
objabi.R_LOONG64_ADDR_HI, // used with PC-relative load
|
objabi.R_LOONG64_ADDR_HI, // used with PC-relative load
|
||||||
|
objabi.R_LOONG64_ADDR_PCREL20_S2, // used with PC-relative load
|
||||||
|
objabi.R_LOONG64_CALL36,
|
||||||
objabi.R_LOONG64_TLS_LE_HI,
|
objabi.R_LOONG64_TLS_LE_HI,
|
||||||
objabi.R_LOONG64_TLS_LE_LO,
|
objabi.R_LOONG64_TLS_LE_LO,
|
||||||
objabi.R_LOONG64_TLS_IE_HI,
|
objabi.R_LOONG64_TLS_IE_HI,
|
||||||
|
|
|
||||||
|
|
@ -334,6 +334,10 @@ const (
|
||||||
R_LOONG64_ADDR_HI
|
R_LOONG64_ADDR_HI
|
||||||
R_LOONG64_ADDR_LO
|
R_LOONG64_ADDR_LO
|
||||||
|
|
||||||
|
// R_LOONG64_ADDR_PCREL20_S2 resolves to the 22-bit, 4-byte aligned offset of an
|
||||||
|
// external address, by encoding it into a PCADDI instruction.
|
||||||
|
R_LOONG64_ADDR_PCREL20_S2
|
||||||
|
|
||||||
// R_LOONG64_TLS_LE_HI resolves to the high 20 bits of a TLS address (offset from
|
// R_LOONG64_TLS_LE_HI resolves to the high 20 bits of a TLS address (offset from
|
||||||
// thread pointer), by encoding it into the instruction.
|
// thread pointer), by encoding it into the instruction.
|
||||||
// R_LOONG64_TLS_LE_LO resolves to the low 12 bits of a TLS address (offset from
|
// R_LOONG64_TLS_LE_LO resolves to the low 12 bits of a TLS address (offset from
|
||||||
|
|
@ -341,10 +345,14 @@ const (
|
||||||
R_LOONG64_TLS_LE_HI
|
R_LOONG64_TLS_LE_HI
|
||||||
R_LOONG64_TLS_LE_LO
|
R_LOONG64_TLS_LE_LO
|
||||||
|
|
||||||
// R_CALLLOONG64 resolves to non-PC-relative target address of a CALL (BL/JIRL)
|
// R_CALLLOONG64 resolves to the 28-bit 4-byte aligned PC-relative target
|
||||||
// instruction, by encoding the address into the instruction.
|
// address of a BL instruction, by encoding it into the instruction.
|
||||||
R_CALLLOONG64
|
R_CALLLOONG64
|
||||||
|
|
||||||
|
// R_LOONG64_CALL36 resolves to the 38-bit 4-byte aligned PC-relative target
|
||||||
|
// address of a PCADDU18I + JIRL pair, by encoding it into the instructions.
|
||||||
|
R_LOONG64_CALL36
|
||||||
|
|
||||||
// R_LOONG64_TLS_IE_HI and R_LOONG64_TLS_IE_LO relocates a pcalau12i, ld.d
|
// R_LOONG64_TLS_IE_HI and R_LOONG64_TLS_IE_LO relocates a pcalau12i, ld.d
|
||||||
// pair to compute the address of the GOT slot of the tls symbol.
|
// pair to compute the address of the GOT slot of the tls symbol.
|
||||||
R_LOONG64_TLS_IE_HI
|
R_LOONG64_TLS_IE_HI
|
||||||
|
|
@ -360,14 +368,17 @@ const (
|
||||||
// 64-bit in-place subtraction.
|
// 64-bit in-place subtraction.
|
||||||
R_LOONG64_SUB64
|
R_LOONG64_SUB64
|
||||||
|
|
||||||
// R_JMP16LOONG64 resolves to 18-bit PC-relative target address of a JMP instructions.
|
// R_JMP16LOONG64 resolves to the 18-bit 4-byte aligned PC-relative target
|
||||||
|
// address of a BEQ/BNE/BLT/BGE/BLTU/BGEU instruction, by encoding it into
|
||||||
|
// the instruction.
|
||||||
R_JMP16LOONG64
|
R_JMP16LOONG64
|
||||||
|
|
||||||
// R_JMP21LOONG64 resolves to 23-bit PC-relative target address of a JMP instructions.
|
// R_JMP21LOONG64 resolves to the 23-bit 4-byte aligned PC-relative target
|
||||||
|
// address of a BEQZ/BNEZ instruction, by encoding it into the instruction.
|
||||||
R_JMP21LOONG64
|
R_JMP21LOONG64
|
||||||
|
|
||||||
// R_JMPLOONG64 resolves to non-PC-relative target address of a JMP instruction,
|
// R_JMPLOONG64 resolves to the 28-bit 4-byte aligned PC-relative target
|
||||||
// by encoding the address into the instruction.
|
// address of a B instruction, by encoding it into the instruction.
|
||||||
R_JMPLOONG64
|
R_JMPLOONG64
|
||||||
|
|
||||||
// R_ADDRMIPSU (only used on mips/mips64) resolves to the sign-adjusted "upper" 16
|
// R_ADDRMIPSU (only used on mips/mips64) resolves to the sign-adjusted "upper" 16
|
||||||
|
|
|
||||||
|
|
@ -86,34 +86,36 @@ func _() {
|
||||||
_ = x[R_PCRELDBL-76]
|
_ = x[R_PCRELDBL-76]
|
||||||
_ = x[R_LOONG64_ADDR_HI-77]
|
_ = x[R_LOONG64_ADDR_HI-77]
|
||||||
_ = x[R_LOONG64_ADDR_LO-78]
|
_ = x[R_LOONG64_ADDR_LO-78]
|
||||||
_ = x[R_LOONG64_TLS_LE_HI-79]
|
_ = x[R_LOONG64_ADDR_PCREL20_S2-79]
|
||||||
_ = x[R_LOONG64_TLS_LE_LO-80]
|
_ = x[R_LOONG64_TLS_LE_HI-80]
|
||||||
_ = x[R_CALLLOONG64-81]
|
_ = x[R_LOONG64_TLS_LE_LO-81]
|
||||||
_ = x[R_LOONG64_TLS_IE_HI-82]
|
_ = x[R_CALLLOONG64-82]
|
||||||
_ = x[R_LOONG64_TLS_IE_LO-83]
|
_ = x[R_LOONG64_CALL36-83]
|
||||||
_ = x[R_LOONG64_GOT_HI-84]
|
_ = x[R_LOONG64_TLS_IE_HI-84]
|
||||||
_ = x[R_LOONG64_GOT_LO-85]
|
_ = x[R_LOONG64_TLS_IE_LO-85]
|
||||||
_ = x[R_LOONG64_ADD64-86]
|
_ = x[R_LOONG64_GOT_HI-86]
|
||||||
_ = x[R_LOONG64_SUB64-87]
|
_ = x[R_LOONG64_GOT_LO-87]
|
||||||
_ = x[R_JMP16LOONG64-88]
|
_ = x[R_LOONG64_ADD64-88]
|
||||||
_ = x[R_JMP21LOONG64-89]
|
_ = x[R_LOONG64_SUB64-89]
|
||||||
_ = x[R_JMPLOONG64-90]
|
_ = x[R_JMP16LOONG64-90]
|
||||||
_ = x[R_ADDRMIPSU-91]
|
_ = x[R_JMP21LOONG64-91]
|
||||||
_ = x[R_ADDRMIPSTLS-92]
|
_ = x[R_JMPLOONG64-92]
|
||||||
_ = x[R_ADDRCUOFF-93]
|
_ = x[R_ADDRMIPSU-93]
|
||||||
_ = x[R_WASMIMPORT-94]
|
_ = x[R_ADDRMIPSTLS-94]
|
||||||
_ = x[R_XCOFFREF-95]
|
_ = x[R_ADDRCUOFF-95]
|
||||||
_ = x[R_PEIMAGEOFF-96]
|
_ = x[R_WASMIMPORT-96]
|
||||||
_ = x[R_INITORDER-97]
|
_ = x[R_XCOFFREF-97]
|
||||||
_ = x[R_DWTXTADDR_U1-98]
|
_ = x[R_PEIMAGEOFF-98]
|
||||||
_ = x[R_DWTXTADDR_U2-99]
|
_ = x[R_INITORDER-99]
|
||||||
_ = x[R_DWTXTADDR_U3-100]
|
_ = x[R_DWTXTADDR_U1-100]
|
||||||
_ = x[R_DWTXTADDR_U4-101]
|
_ = x[R_DWTXTADDR_U2-101]
|
||||||
|
_ = x[R_DWTXTADDR_U3-102]
|
||||||
|
_ = x[R_DWTXTADDR_U4-103]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_GOT_PCREL_ITYPER_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_ADD32R_RISCV_SUB32R_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_LOONG64_ADDR_HIR_LOONG64_ADDR_LOR_LOONG64_TLS_LE_HIR_LOONG64_TLS_LE_LOR_CALLLOONG64R_LOONG64_TLS_IE_HIR_LOONG64_TLS_IE_LOR_LOONG64_GOT_HIR_LOONG64_GOT_LOR_LOONG64_ADD64R_LOONG64_SUB64R_JMP16LOONG64R_JMP21LOONG64R_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDERR_DWTXTADDR_U1R_DWTXTADDR_U2R_DWTXTADDR_U3R_DWTXTADDR_U4"
|
const _RelocType_name = "R_ADDRR_ADDRPOWERR_ADDRARM64R_ADDRMIPSR_ADDROFFR_SIZER_CALLR_CALLARMR_CALLARM64R_CALLINDR_CALLPOWERR_CALLMIPSR_CONSTR_PCRELR_TLS_LER_TLS_IER_GOTOFFR_PLT0R_PLT1R_PLT2R_USEFIELDR_USETYPER_USEIFACER_USEIFACEMETHODR_USENAMEDMETHODR_METHODOFFR_KEEPR_POWER_TOCR_GOTPCRELR_JMPMIPSR_DWARFSECREFR_ARM64_TLS_LER_ARM64_TLS_IER_ARM64_GOTPCRELR_ARM64_GOTR_ARM64_PCRELR_ARM64_PCREL_LDST8R_ARM64_PCREL_LDST16R_ARM64_PCREL_LDST32R_ARM64_PCREL_LDST64R_ARM64_LDST8R_ARM64_LDST16R_ARM64_LDST32R_ARM64_LDST64R_ARM64_LDST128R_POWER_TLS_LER_POWER_TLS_IER_POWER_TLSR_POWER_TLS_IE_PCREL34R_POWER_TLS_LE_TPREL34R_ADDRPOWER_DSR_ADDRPOWER_GOTR_ADDRPOWER_GOT_PCREL34R_ADDRPOWER_PCRELR_ADDRPOWER_TOCRELR_ADDRPOWER_TOCREL_DSR_ADDRPOWER_D34R_ADDRPOWER_PCREL34R_RISCV_JALR_RISCV_JAL_TRAMPR_RISCV_CALLR_RISCV_PCREL_ITYPER_RISCV_PCREL_STYPER_RISCV_TLS_IER_RISCV_TLS_LER_RISCV_GOT_HI20R_RISCV_GOT_PCREL_ITYPER_RISCV_PCREL_HI20R_RISCV_PCREL_LO12_IR_RISCV_PCREL_LO12_SR_RISCV_BRANCHR_RISCV_ADD32R_RISCV_SUB32R_RISCV_RVC_BRANCHR_RISCV_RVC_JUMPR_PCRELDBLR_LOONG64_ADDR_HIR_LOONG64_ADDR_LOR_LOONG64_ADDR_PCREL20_S2R_LOONG64_TLS_LE_HIR_LOONG64_TLS_LE_LOR_CALLLOONG64R_LOONG64_CALL36R_LOONG64_TLS_IE_HIR_LOONG64_TLS_IE_LOR_LOONG64_GOT_HIR_LOONG64_GOT_LOR_LOONG64_ADD64R_LOONG64_SUB64R_JMP16LOONG64R_JMP21LOONG64R_JMPLOONG64R_ADDRMIPSUR_ADDRMIPSTLSR_ADDRCUOFFR_WASMIMPORTR_XCOFFREFR_PEIMAGEOFFR_INITORDERR_DWTXTADDR_U1R_DWTXTADDR_U2R_DWTXTADDR_U3R_DWTXTADDR_U4"
|
||||||
|
|
||||||
var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 330, 341, 354, 373, 393, 413, 433, 446, 460, 474, 488, 503, 517, 531, 542, 564, 586, 600, 615, 638, 655, 673, 694, 709, 728, 739, 756, 768, 787, 806, 820, 834, 850, 873, 891, 911, 931, 945, 958, 971, 989, 1005, 1015, 1032, 1049, 1068, 1087, 1100, 1119, 1138, 1154, 1170, 1185, 1200, 1214, 1228, 1240, 1251, 1264, 1275, 1287, 1297, 1309, 1320, 1334, 1348, 1362, 1376}
|
var _RelocType_index = [...]uint16{0, 6, 17, 28, 38, 47, 53, 59, 68, 79, 88, 99, 109, 116, 123, 131, 139, 147, 153, 159, 165, 175, 184, 194, 210, 226, 237, 243, 254, 264, 273, 286, 300, 314, 330, 341, 354, 373, 393, 413, 433, 446, 460, 474, 488, 503, 517, 531, 542, 564, 586, 600, 615, 638, 655, 673, 694, 709, 728, 739, 756, 768, 787, 806, 820, 834, 850, 873, 891, 911, 931, 945, 958, 971, 989, 1005, 1015, 1032, 1049, 1074, 1093, 1112, 1125, 1141, 1160, 1179, 1195, 1211, 1226, 1241, 1255, 1269, 1281, 1292, 1305, 1316, 1328, 1338, 1350, 1361, 1375, 1389, 1403, 1417}
|
||||||
|
|
||||||
func (i RelocType) String() string {
|
func (i RelocType) String() string {
|
||||||
i -= 1
|
i -= 1
|
||||||
|
|
|
||||||
|
|
@ -1065,13 +1065,15 @@ func relSize(arch *sys.Arch, pn string, elftype uint32) (uint8, uint8, error) {
|
||||||
LOONG64 | uint32(elf.R_LARCH_PCALA_LO12)<<16,
|
LOONG64 | uint32(elf.R_LARCH_PCALA_LO12)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_GOT_PC_HI20)<<16,
|
LOONG64 | uint32(elf.R_LARCH_GOT_PC_HI20)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_GOT_PC_LO12)<<16,
|
LOONG64 | uint32(elf.R_LARCH_GOT_PC_LO12)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_32_PCREL)<<16:
|
LOONG64 | uint32(elf.R_LARCH_32_PCREL)<<16,
|
||||||
|
LOONG64 | uint32(elf.R_LARCH_PCREL20_S2)<<16:
|
||||||
return 4, 4, nil
|
return 4, 4, nil
|
||||||
|
|
||||||
case LOONG64 | uint32(elf.R_LARCH_64)<<16,
|
case LOONG64 | uint32(elf.R_LARCH_64)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_ADD64)<<16,
|
LOONG64 | uint32(elf.R_LARCH_ADD64)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_SUB64)<<16,
|
LOONG64 | uint32(elf.R_LARCH_SUB64)<<16,
|
||||||
LOONG64 | uint32(elf.R_LARCH_64_PCREL)<<16:
|
LOONG64 | uint32(elf.R_LARCH_64_PCREL)<<16,
|
||||||
|
LOONG64 | uint32(elf.R_LARCH_CALL36)<<16:
|
||||||
return 8, 8, nil
|
return 8, 8, nil
|
||||||
|
|
||||||
case S390X | uint32(elf.R_390_8)<<16:
|
case S390X | uint32(elf.R_390_8)<<16:
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
||||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26):
|
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_B26),
|
||||||
|
objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_CALL36):
|
||||||
if targType == sym.SDYNIMPORT {
|
if targType == sym.SDYNIMPORT {
|
||||||
addpltsym(target, ldr, syms, targ)
|
addpltsym(target, ldr, syms, targ)
|
||||||
su := ldr.MakeSymbolUpdater(s)
|
su := ldr.MakeSymbolUpdater(s)
|
||||||
|
|
@ -95,8 +96,12 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
|
||||||
if targType == 0 || targType == sym.SXREF {
|
if targType == 0 || targType == sym.SXREF {
|
||||||
ldr.Errorf(s, "unknown symbol %s in callloong64", ldr.SymName(targ))
|
ldr.Errorf(s, "unknown symbol %s in callloong64", ldr.SymName(targ))
|
||||||
}
|
}
|
||||||
|
relocType := objabi.R_CALLLOONG64
|
||||||
|
if r.Type() == objabi.ElfRelocOffset+objabi.RelocType(elf.R_LARCH_CALL36) {
|
||||||
|
relocType = objabi.R_LOONG64_CALL36
|
||||||
|
}
|
||||||
su := ldr.MakeSymbolUpdater(s)
|
su := ldr.MakeSymbolUpdater(s)
|
||||||
su.SetRelocType(rIdx, objabi.R_CALLLOONG64)
|
su.SetRelocType(rIdx, relocType)
|
||||||
return true
|
return true
|
||||||
|
|
||||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_GOT_PC_HI20),
|
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_GOT_PC_HI20),
|
||||||
|
|
@ -117,7 +122,8 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
|
||||||
return true
|
return true
|
||||||
|
|
||||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_PCALA_HI20),
|
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_PCALA_HI20),
|
||||||
objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_PCALA_LO12):
|
objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_PCALA_LO12),
|
||||||
|
objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_PCREL20_S2):
|
||||||
if targType == sym.SDYNIMPORT {
|
if targType == sym.SDYNIMPORT {
|
||||||
ldr.Errorf(s, "unexpected relocation for dynamic symbol %s", ldr.SymName(targ))
|
ldr.Errorf(s, "unexpected relocation for dynamic symbol %s", ldr.SymName(targ))
|
||||||
}
|
}
|
||||||
|
|
@ -125,12 +131,17 @@ func adddynrel(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, s loade
|
||||||
ldr.Errorf(s, "unknown symbol %s", ldr.SymName(targ))
|
ldr.Errorf(s, "unknown symbol %s", ldr.SymName(targ))
|
||||||
}
|
}
|
||||||
|
|
||||||
su := ldr.MakeSymbolUpdater(s)
|
var relocType objabi.RelocType
|
||||||
if r.Type() == objabi.ElfRelocOffset+objabi.RelocType(elf.R_LARCH_PCALA_HI20) {
|
switch r.Type() - objabi.ElfRelocOffset {
|
||||||
su.SetRelocType(rIdx, objabi.R_LOONG64_ADDR_HI)
|
case objabi.RelocType(elf.R_LARCH_PCALA_HI20):
|
||||||
} else {
|
relocType = objabi.R_LOONG64_ADDR_HI
|
||||||
su.SetRelocType(rIdx, objabi.R_LOONG64_ADDR_LO)
|
case objabi.RelocType(elf.R_LARCH_PCALA_LO12):
|
||||||
|
relocType = objabi.R_LOONG64_ADDR_LO
|
||||||
|
case objabi.RelocType(elf.R_LARCH_PCREL20_S2):
|
||||||
|
relocType = objabi.R_LOONG64_ADDR_PCREL20_S2
|
||||||
}
|
}
|
||||||
|
su := ldr.MakeSymbolUpdater(s)
|
||||||
|
su.SetRelocType(rIdx, relocType)
|
||||||
return true
|
return true
|
||||||
|
|
||||||
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_ADD64),
|
case objabi.ElfRelocOffset + objabi.RelocType(elf.R_LARCH_ADD64),
|
||||||
|
|
@ -418,6 +429,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
|
||||||
out.Write64(uint64(elf.R_LARCH_B26) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_LARCH_B26) | uint64(elfsym)<<32)
|
||||||
out.Write64(uint64(r.Xadd))
|
out.Write64(uint64(r.Xadd))
|
||||||
|
|
||||||
|
case objabi.R_LOONG64_CALL36:
|
||||||
|
out.Write64(uint64(sectoff))
|
||||||
|
out.Write64(uint64(elf.R_LARCH_CALL36) | uint64(elfsym)<<32)
|
||||||
|
out.Write64(uint64(r.Xadd))
|
||||||
|
|
||||||
case objabi.R_LOONG64_TLS_IE_HI:
|
case objabi.R_LOONG64_TLS_IE_HI:
|
||||||
out.Write64(uint64(sectoff))
|
out.Write64(uint64(sectoff))
|
||||||
out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_HI20) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_LARCH_TLS_IE_PC_HI20) | uint64(elfsym)<<32)
|
||||||
|
|
@ -438,6 +454,11 @@ func elfreloc1(ctxt *ld.Link, out *ld.OutBuf, ldr *loader.Loader, s loader.Sym,
|
||||||
out.Write64(uint64(elf.R_LARCH_PCALA_HI20) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_LARCH_PCALA_HI20) | uint64(elfsym)<<32)
|
||||||
out.Write64(uint64(r.Xadd))
|
out.Write64(uint64(r.Xadd))
|
||||||
|
|
||||||
|
case objabi.R_LOONG64_ADDR_PCREL20_S2:
|
||||||
|
out.Write64(uint64(sectoff))
|
||||||
|
out.Write64(uint64(elf.R_LARCH_PCREL20_S2) | uint64(elfsym)<<32)
|
||||||
|
out.Write64(uint64(r.Xadd))
|
||||||
|
|
||||||
case objabi.R_LOONG64_GOT_HI:
|
case objabi.R_LOONG64_GOT_HI:
|
||||||
out.Write64(uint64(sectoff))
|
out.Write64(uint64(sectoff))
|
||||||
out.Write64(uint64(elf.R_LARCH_GOT_PC_HI20) | uint64(elfsym)<<32)
|
out.Write64(uint64(elf.R_LARCH_GOT_PC_HI20) | uint64(elfsym)<<32)
|
||||||
|
|
@ -463,7 +484,8 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
default:
|
default:
|
||||||
return val, 0, false
|
return val, 0, false
|
||||||
case objabi.R_LOONG64_ADDR_HI,
|
case objabi.R_LOONG64_ADDR_HI,
|
||||||
objabi.R_LOONG64_ADDR_LO:
|
objabi.R_LOONG64_ADDR_LO,
|
||||||
|
objabi.R_LOONG64_ADDR_PCREL20_S2:
|
||||||
// set up addend for eventual relocation via outer symbol.
|
// set up addend for eventual relocation via outer symbol.
|
||||||
rs, _ := ld.FoldSubSymbolOffset(ldr, rs)
|
rs, _ := ld.FoldSubSymbolOffset(ldr, rs)
|
||||||
rst := ldr.SymType(rs)
|
rst := ldr.SymType(rs)
|
||||||
|
|
@ -474,6 +496,7 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
case objabi.R_LOONG64_TLS_LE_HI,
|
case objabi.R_LOONG64_TLS_LE_HI,
|
||||||
objabi.R_LOONG64_TLS_LE_LO,
|
objabi.R_LOONG64_TLS_LE_LO,
|
||||||
objabi.R_CALLLOONG64,
|
objabi.R_CALLLOONG64,
|
||||||
|
objabi.R_LOONG64_CALL36,
|
||||||
objabi.R_JMPLOONG64,
|
objabi.R_JMPLOONG64,
|
||||||
objabi.R_LOONG64_TLS_IE_HI,
|
objabi.R_LOONG64_TLS_IE_HI,
|
||||||
objabi.R_LOONG64_TLS_IE_LO,
|
objabi.R_LOONG64_TLS_IE_LO,
|
||||||
|
|
@ -499,6 +522,10 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
return val&0xffc003ff | (t << 10), noExtReloc, isOk
|
return val&0xffc003ff | (t << 10), noExtReloc, isOk
|
||||||
}
|
}
|
||||||
return val&0xfe00001f | (t << 5), noExtReloc, isOk
|
return val&0xfe00001f | (t << 5), noExtReloc, isOk
|
||||||
|
case objabi.R_LOONG64_ADDR_PCREL20_S2:
|
||||||
|
pc := ldr.SymValue(s) + int64(r.Off())
|
||||||
|
t := (ldr.SymAddr(rs) + r.Add() - pc) >> 2
|
||||||
|
return val&0xfe00001f | ((t & 0xfffff) << 5), noExtReloc, isOk
|
||||||
case objabi.R_LOONG64_TLS_LE_HI,
|
case objabi.R_LOONG64_TLS_LE_HI,
|
||||||
objabi.R_LOONG64_TLS_LE_LO:
|
objabi.R_LOONG64_TLS_LE_LO:
|
||||||
t := ldr.SymAddr(rs) + r.Add()
|
t := ldr.SymAddr(rs) + r.Add()
|
||||||
|
|
@ -512,6 +539,14 @@ func archreloc(target *ld.Target, ldr *loader.Loader, syms *ld.ArchSyms, r loade
|
||||||
t := ldr.SymAddr(rs) + r.Add() - pc
|
t := ldr.SymAddr(rs) + r.Add() - pc
|
||||||
return val&0xfc000000 | (((t >> 2) & 0xffff) << 10) | (((t >> 2) & 0x3ff0000) >> 16), noExtReloc, isOk
|
return val&0xfc000000 | (((t >> 2) & 0xffff) << 10) | (((t >> 2) & 0x3ff0000) >> 16), noExtReloc, isOk
|
||||||
|
|
||||||
|
case objabi.R_LOONG64_CALL36:
|
||||||
|
pc := ldr.SymValue(s) + int64(r.Off())
|
||||||
|
t := (ldr.SymAddr(rs) + r.Add() - pc) >> 2
|
||||||
|
// val is pcaddu18i (lower half) + jirl (upper half)
|
||||||
|
pcaddu18i := (val & 0xfe00001f) | (((t + 0x8000) >> 16) << 5)
|
||||||
|
jirl := ((val >> 32) & 0xfc0003ff) | ((t & 0xffff) << 10)
|
||||||
|
return pcaddu18i | (jirl << 32), noExtReloc, isOk
|
||||||
|
|
||||||
case objabi.R_JMP16LOONG64,
|
case objabi.R_JMP16LOONG64,
|
||||||
objabi.R_JMP21LOONG64:
|
objabi.R_JMP21LOONG64:
|
||||||
pc := ldr.SymValue(s) + int64(r.Off())
|
pc := ldr.SymValue(s) + int64(r.Off())
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue