git: 1ae6faf16455 - main - LoongArch: elftoolchain: add support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 12 Jun 2025 00:29:02 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=1ae6faf1645516bbb97eaf2a43d867b59b22309b
commit 1ae6faf1645516bbb97eaf2a43d867b59b22309b
Author: yu shan wei <mpysw@vip.163.com>
AuthorDate: 2025-04-29 02:08:12 +0000
Commit: Warner Losh <imp@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 <gehaowu@bitmoe.com>
Co-authored-by: xiaoqiang zhao <zxq_yx_007@163.com>
Signed-off-by: yu shan wei <mpysw@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 */