Le 25/05/2022 à 19:27, Christophe Leroy a écrit :
Le 24/05/2022 à 15:33, Christophe Leroy a écrit :
Le 24/05/2022 à 13:00, Sathvika Vasireddy a écrit :
+{Wouldn't it be better to make that function arch specific ?
+ switch (elf->ehdr.e_machine) {
+ case EM_X86_64:
+ return R_X86_64_64;
+ case EM_PPC64:
+ return R_PPC64_ADDR64;
+ default:
+ WARN("unknown machine...");
+ exit(-1);
+ }
+}
This is so that we can support cross architecture builds.
I'm not sure I follow you here.
This is only based on the target, it doesn't depend on the build host so
I can't the link with cross arch builds.
The same as you have arch_decode_instruction(), you could have
arch_elf_reloc_type_long()
It would make sense indeed, because there is no point in supporting X86
relocation when you don't support X86 instruction decoding.
Could simply be some macro defined in tools/objtool/arch/powerpc/include/arch/elf.h and tools/objtool/arch/x86/include/arch/elf.h
The x86 version would be:
#define R_ADDR(elf) R_X86_64_64
And the powerpc version would be:
#define R_ADDR(elf) (elf->ehdr.e_machine == EM_PPC64 ? R_PPC64_ADDR64 : R_PPC_ADDR32)
Well, looking once more, and taking into account the patch from Chen https://lore.kernel.org/lkml/20220531020744.236970-4-chenzhongjin@xxxxxxxxxx/
It would be easier to just define two macros:
#define R_ABS64 R_PPC64_ADDR64
#define R_ABS32 R_PPC_ADDR32
And then in the caller, as we know the size, do something like
size == sizeof(u64) ? R_ABS64 : R_ABS32;