The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=1ae6faf1645516bbb97eaf2a43d867b59b22309b
commit 1ae6faf1645516bbb97eaf2a43d867b59b22309b Author: yu shan wei <mp...@vip.163.com> AuthorDate: 2025-04-29 02:08:12 +0000 Commit: Warner Losh <i...@freebsd.org> CommitDate: 2025-06-12 00:21:30 +0000 LoongArch: elftoolchain: add support According to the latest elftoolchain r4191, add support for Loongarch Co-authored-by: haowuge <geha...@bitmoe.com> Co-authored-by: xiaoqiang zhao <zxq_yx_...@163.com> Signed-off-by: yu shan wei <mp...@vip.163.com> Reviewed by: imp Pull Request: https://github.com/freebsd/freebsd-src/pull/1682 Closes: https://github.com/freebsd/freebsd-src/pull/1682 --- contrib/elftoolchain/libdwarf/libdwarf.h | 1 + contrib/elftoolchain/libdwarf/libdwarf_reloc.c | 8 ++ contrib/elftoolchain/libelf/_libelf_config.h | 6 ++ .../elftoolchain/libelftc/elftc_reloc_type_str.c | 119 +++++++++++++++++++++ contrib/elftoolchain/libelftc/libelftc_bfdtarget.c | 31 ++++++ contrib/elftoolchain/libpe/pe.h | 2 + 6 files changed, 167 insertions(+) diff --git a/contrib/elftoolchain/libdwarf/libdwarf.h b/contrib/elftoolchain/libdwarf/libdwarf.h index 0aa1857e3285..e8419620755d 100644 --- a/contrib/elftoolchain/libdwarf/libdwarf.h +++ b/contrib/elftoolchain/libdwarf/libdwarf.h @@ -442,6 +442,7 @@ enum Dwarf_ISA { DW_ISA_X86_64, DW_ISA_AARCH64, DW_ISA_RISCV, + DW_ISA_LOONGARCH, DW_ISA_MAX }; diff --git a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c index e76675838e41..d8ea4e36d29d 100644 --- a/contrib/elftoolchain/libdwarf/libdwarf_reloc.c +++ b/contrib/elftoolchain/libdwarf/libdwarf_reloc.c @@ -51,6 +51,8 @@ _dwarf_get_reloc_type(Dwarf_P_Debug dbg, int is64) return (is64 ? R_MIPS_64 : R_MIPS_32); case DW_ISA_RISCV: return (is64 ? R_RISCV_64 : R_RISCV_32); + case DW_ISA_LOONGARCH: + return (is64 ? R_LARCH_64 : R_LARCH_32); case DW_ISA_IA64: return (is64 ? R_IA_64_DIR64LSB : R_IA_64_DIR32LSB); default: @@ -115,6 +117,12 @@ _dwarf_get_reloc_size(Dwarf_Debug dbg, Dwarf_Unsigned rel_type) else if (rel_type == R_RISCV_64) return (8); break; + case EM_LOONGARCH: + if (rel_type == R_LARCH_32) + return (4); + else if (rel_type == R_LARCH_64) + return (8); + break; case EM_IA_64: if (rel_type == R_IA_64_SECREL32LSB) return (4); diff --git a/contrib/elftoolchain/libelf/_libelf_config.h b/contrib/elftoolchain/libelf/_libelf_config.h index 0f16f3aefde5..df33e974a94b 100644 --- a/contrib/elftoolchain/libelf/_libelf_config.h +++ b/contrib/elftoolchain/libelf/_libelf_config.h @@ -105,6 +105,12 @@ #define LIBELF_BYTEORDER ELFDATA2LSB #define LIBELF_CLASS ELFCLASS64 +#elif defined(__loongarch64) + +#define LIBELF_ARCH EM_LOONGARCH +#define LIBELF_BYTEORDER ELFDATA2LSB +#define LIBELF_CLASS ELFCLASS64 + #elif defined(__sparc__) #define LIBELF_ARCH EM_SPARCV9 diff --git a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c index bc8ff6c0d2c6..48970714c7d4 100644 --- a/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c +++ b/contrib/elftoolchain/libelftc/elftc_reloc_type_str.c @@ -670,6 +670,125 @@ elftc_reloc_type_str(unsigned int mach, unsigned int type) case 58: return "R_RISCV_IRELATIVE"; } break; + case EM_LOONGARCH: + switch (type) { + case 0: return "R_LARCH_NONE"; + case 1: return "R_LARCH_32"; + case 2: return "R_LARCH_64"; + case 3: return "R_LARCH_RELATIVE"; + case 4: return "R_LARCH_COPY"; + case 5: return "R_LARCH_JUMP_SLOT"; + case 6: return "R_LARCH_TLS_DTPMOD32"; + case 7: return "R_LARCH_TLS_DTPMOD64"; + case 8: return "R_LARCH_TLS_DTPREL32"; + case 9: return "R_LARCH_TLS_DTPREL64"; + case 10: return "R_LARCH_TLS_TPREL32"; + case 11: return "R_LARCH_TLS_TPREL64"; + case 12: return "R_LARCH_IRELATIVE"; + case 13: return "R_LARCH_TLS_DESC32"; + case 14: return "R_LARCH_TLS_DESC64"; + case 20: return "R_LARCH_MARK_LA"; + case 21: return "R_LARCH_MARK_PCREL"; + case 22: return "R_LARCH_SOP_PUSH_PCREL"; + case 23: return "R_LARCH_SOP_PUSH_ABSOLUTE"; + case 24: return "R_LARCH_SOP_PUSH_DUP"; + case 25: return "R_LARCH_SOP_PUSH_GPREL"; + case 26: return "R_LARCH_SOP_PUSH_TLS_TPREL"; + case 27: return "R_LARCH_SOP_PUSH_TLS_GOT"; + case 28: return "R_LARCH_SOP_PUSH_TLS_GD"; + case 29: return "R_LARCH_SOP_PUSH_PLT_PCREL"; + case 30: return "R_LARCH_SOP_ASSERT"; + case 31: return "R_LARCH_SOP_NOT"; + case 32: return "R_LARCH_SOP_SUB"; + case 33: return "R_LARCH_SOP_SL"; + case 34: return "R_LARCH_SOP_SR"; + case 35: return "R_LARCH_SOP_ADD"; + case 36: return "R_LARCH_SOP_AND"; + case 37: return "R_LARCH_SOP_IF_ELSE"; + case 38: return "R_LARCH_SOP_POP_32_S_10_5"; + case 39: return "R_LARCH_SOP_POP_32_U_10_12"; + case 40: return "R_LARCH_SOP_POP_32_S_10_12"; + case 41: return "R_LARCH_SOP_POP_32_S_10_16"; + case 42: return "R_LARCH_SOP_POP_32_S_10_16_S2"; + case 43: return "R_LARCH_SOP_POP_32_S_5_20"; + case 44: return "R_LARCH_SOP_POP_32_S_0_5_10_16_S2"; + case 45: return "R_LARCH_SOP_POP_32_S_0_10_10_16_S2"; + case 46: return "R_LARCH_SOP_POP_32_U"; + case 47: return "R_LARCH_ADD8"; + case 48: return "R_LARCH_ADD16"; + case 49: return "R_LARCH_ADD24"; + case 50: return "R_LARCH_ADD32"; + case 51: return "R_LARCH_ADD64"; + case 52: return "R_LARCH_SUB8"; + case 53: return "R_LARCH_SUB16"; + case 54: return "R_LARCH_SUB24"; + case 55: return "R_LARCH_SUB32"; + case 56: return "R_LARCH_SUB64"; + case 57: return "R_LARCH_GNU_VTINHERIT"; + case 58: return "R_LARCH_GNU_VTENTRY"; + case 64: return "R_LARCH_B16"; + case 65: return "R_LARCH_B21"; + case 66: return "R_LARCH_B26"; + case 67: return "R_LARCH_ABS_HI20"; + case 68: return "R_LARCH_ABS_LO12"; + case 69: return "R_LARCH_ABS64_LO20"; + case 70: return "R_LARCH_ABS64_HI12"; + case 71: return "R_LARCH_PCALA_HI20"; + case 72: return "R_LARCH_PCALA_LO12"; + case 73: return "R_LARCH_PCALA64_LO20"; + case 74: return "R_LARCH_PCALA64_HI12"; + case 75: return "R_LARCH_GOT_PC_HI20"; + case 76: return "R_LARCH_GOT_PC_LO12"; + case 77: return "R_LARCH_GOT64_PC_LO20"; + case 78: return "R_LARCH_GOT64_PC_HI12"; + case 79: return "R_LARCH_GOT_HI20"; + case 80: return "R_LARCH_GOT_LO12"; + case 81: return "R_LARCH_GOT64_LO20"; + case 82: return "R_LARCH_GOT64_HI12"; + case 83: return "R_LARCH_TLS_LE_HI20"; + case 84: return "R_LARCH_TLS_LE_LO12"; + case 85: return "R_LARCH_TLS_LE64_LO20"; + case 86: return "R_LARCH_TLS_LE64_HI12"; + case 87: return "R_LARCH_TLS_IE_PC_HI20"; + case 88: return "R_LARCH_TLS_IE_PC_LO12"; + case 89: return "R_LARCH_TLS_IE64_PC_LO20"; + case 90: return "R_LARCH_TLS_IE64_PC_HI12"; + case 91: return "R_LARCH_TLS_IE_HI20"; + case 92: return "R_LARCH_TLS_IE_LO12"; + case 93: return "R_LARCH_TLS_IE64_LO20"; + case 94: return "R_LARCH_TLS_IE64_HI12"; + case 95: return "R_LARCH_TLS_LD_PC_HI20"; + case 96: return "R_LARCH_TLS_LD_HI20"; + case 97: return "R_LARCH_TLS_GD_PC_HI20"; + case 98: return "R_LARCH_TLS_GD_HI20"; + case 99: return "R_LARCH_32_PCREL"; + case 100: return "R_LARCH_RELAX"; + case 102: return "R_LARCH_ALIGN"; + case 103: return "R_LARCH_PCREL20_S2"; + case 105: return "R_LARCH_ADD6"; + case 106: return "R_LARCH_SUB6"; + case 107: return "R_LARCH_ADD_ULEB128"; + case 108: return "R_LARCH_SUB_ULEB128"; + case 109: return "R_LARCH_64_PCREL"; + case 110: return "R_LARCH_CALL36"; + case 111: return "R_LARCH_TLS_DESC_PC_HI20"; + case 112: return "R_LARCH_TLS_DESC_PC_LO12"; + case 113: return "R_LARCH_TLS_DESC64_PC_LO20"; + case 114: return "R_LARCH_TLS_DESC64_PC_HI12"; + case 115: return "R_LARCH_TLS_DESC_HI20"; + case 116: return "R_LARCH_TLS_DESC_LO12"; + case 117: return "R_LARCH_TLS_DESC64_LO20"; + case 118: return "R_LARCH_TLS_DESC64_HI12"; + case 119: return "R_LARCH_TLS_DESC_LD"; + case 120: return "R_LARCH_TLS_DESC_CALL"; + case 121: return "R_LARCH_TLS_LE_HI20_R"; + case 122: return "R_LARCH_TLS_LE_ADD_R"; + case 123: return "R_LARCH_TLS_LE_LO12_R"; + case 124: return "R_LARCH_TLS_LD_PCREL20_S2"; + case 125: return "R_LARCH_TLS_GD_PCREL20_S2"; + case 126: return "R_LARCH_TLS_DESC_PCREL20_S2"; + } + break; case EM_S390: switch (type) { case 0: return "R_390_NONE"; diff --git a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c index 3f2c23708549..8aa9e1f90f44 100644 --- a/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c +++ b/contrib/elftoolchain/libelftc/libelftc_bfdtarget.c @@ -340,6 +340,31 @@ struct _Elftc_Bfd_Target _libelftc_targets[] = { .bt_osabi = ELFOSABI_FREEBSD, }, + { + .bt_name = "elf32-loongarch", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS32, + .bt_machine = EM_LOONGARCH, + }, + + { + .bt_name = "elf64-loongarch", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS64, + .bt_machine = EM_LOONGARCH, + }, + + { + .bt_name = "elf64-loongarch-freebsd", + .bt_type = ETF_ELF, + .bt_byteorder = ELFDATA2LSB, + .bt_elfclass = ELFCLASS64, + .bt_machine = EM_LOONGARCH, + .bt_osabi = ELFOSABI_FREEBSD, + }, + { .bt_name = "elf64-sh64", .bt_type = ETF_ELF, @@ -469,6 +494,12 @@ struct _Elftc_Bfd_Target _libelftc_targets[] = { .bt_machine = EM_X86_64, }, + { + .bt_name = "efi-app-loongarch64", + .bt_type = ETF_EFI, + .bt_machine = EM_LOONGARCH, + }, + { .bt_name = "pei-i386", .bt_type = ETF_PE, diff --git a/contrib/elftoolchain/libpe/pe.h b/contrib/elftoolchain/libpe/pe.h index 33969ed8a3e1..b2719d403518 100644 --- a/contrib/elftoolchain/libpe/pe.h +++ b/contrib/elftoolchain/libpe/pe.h @@ -81,6 +81,8 @@ typedef struct _PE_RichHdr { #define IMAGE_FILE_MACHINE_EBC 0xebc /* EFI byte code */ #define IMAGE_FILE_MACHINE_I386 0x14c /* x86 */ #define IMAGE_FILE_MACHINE_IA64 0x200 /* IA64 */ +#define IMAGE_FILE_MACHINE_LOONGARCH32 0x6232 /* LoongArch 32-bit */ +#define IMAGE_FILE_MACHINE_LOONGARCH64 0x6264 /* LoongArch 64-bit */ #define IMAGE_FILE_MACHINE_M32R 0x9041 /* Mitsubishi M32R LE */ #define IMAGE_FILE_MACHINE_MIPS16 0x266 /* MIPS16 */ #define IMAGE_FILE_MACHINE_MIPSFPU 0x366 /* MIPS with FPU */