diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 191950551..19d1263e6 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -26,6 +26,10 @@ #define EM_LOONGARCH 258 #endif +#ifndef R_LARCH_32_PCREL +#define R_LARCH_32_PCREL 99 +#endif + struct alternative { struct alternative *next; struct instruction *insn; @@ -2096,6 +2100,7 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn, struct reloc *reloc = table; struct alternative *alt; unsigned long offset; + unsigned long rodata_entry_size; /* * Each @reloc is a switch table relocation which points to the target @@ -2107,8 +2112,15 @@ static int add_jump_table(struct objtool_file *file, struct instruction *insn, if (reloc != table && reloc == next_table) break; + /* Handle the special cases compiled with Clang on LoongArch */ + if (file->elf->ehdr.e_machine == EM_LOONGARCH && + reloc_type(reloc) == R_LARCH_32_PCREL) + rodata_entry_size = 4; + else + rodata_entry_size = 8; + /* Make sure the table entries are consecutive: */ - if (prev_offset && reloc_offset(reloc) != prev_offset + 8) + if (prev_offset && reloc_offset(reloc) != prev_offset + rodata_entry_size) break; if (reloc->sym->type == STT_SECTION) {