LoongArch: elftoolchain: add support

According to the latest elftoolchain r4191, add support for Loongarch

Co-authored-by: haowuge <[email protected]>
Co-authored-by: xiaoqiang zhao <[email protected]>
Signed-off-by: yu shan wei <[email protected]>
Reviewed by: imp
Pull Request: https://github.com/freebsd/freebsd-src/pull/1682
Closes: https://github.com/freebsd/freebsd-src/pull/1682
This commit is contained in:
yu shan wei authored and Warner Losh committed 2025-06-11 18:21:30 -06:00
1 parent 342e9f2f30
commit 1ae6faf164
6 files changed
+167

No files matched your search

+1
View File
@@ -442,6 +442,7 @@ enum Dwarf_ISA {
DW_ISA_X86_64,
DW_ISA_AARCH64,
DW_ISA_RISCV,
DW_ISA_LOONGARCH,
DW_ISA_MAX
};
@@ -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);
@@ -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
@@ -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";
@@ -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,
+2
View File
@@ -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 */