From 606869223f7fb26d8f48cb735029a5194f12b677 Mon Sep 17 00:00:00 2001 From: Tiezhu Yang Date: Fri, 22 Nov 2024 15:47:43 +0800 Subject: [PATCH] objtool: Handle different entry size of rodata In the most cases, the entry size of rodata is 8 bytes because the relocation type is 64 bit, but when compiling with Clang on LoongArch, there exists 32 bit relocation type, the entry size of rodata should be 4 bytes in this case. This is preparation for later patch on LoongArch, there is no effect for the other archs with this patch. Signed-off-by: Tiezhu Yang Signed-off-by: Huacai Chen Signed-off-by: michael Signed-off-by: maoxiaochuan --- tools/objtool/check.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) 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) {