Hi Mark, Can we add a new file mips.h in backends, and move defines of ELF64_MIPS_R_TYPE/ELF64_MIPS_R_TYPE2/ELF64_MIPS_R_TYPE3 from elf.h to mips.h?
And rename the macro name ELF64_MIPS_R_TYPE to ELF64_MIPS_R_TYPE1 in mips.h? Or rename it directly in elf.h of glibc? Thanks, Ying 在 2023/7/25 16:15, Ying Huang 写道: > Hi Mark, > > In file common-reloc.c, hook functions > reloc_type_check/reloc_type_use/reloc_type_name have these codes: > > #ifdef RELOC_TYPE_ID > reloc = RELOC_TYPE_ID (reloc); > #endif > > And the macro RELOC_TYPE_ID was defined in file backends/sparc_init.c: > > /* In SPARC some relocations use the most significative 24 bits of the > r_type field to encode a secondary addend. Make sure the routines > in common-reloc.c acknowledge this. */ > #define RELOC_TYPE_ID(type) ((type) & 0xff) > > The contents of macro RELOC_TYPE_ID were same as ELF64_MIPS_R_TYPE(new > added), so my view is did not add new hook for mips, if we can do like sparc? > > Thanks, > > Ying > > 在 2023/7/24 16:35, Ying Huang 写道: >> Hi Mark, >> >>>> diff --git a/libebl/eblreloctypecheck.c b/libebl/eblreloctypecheck.c >>>> index 80e67ef7..e3c43944 100644 >>>> --- a/libebl/eblreloctypecheck.c >>>> +++ b/libebl/eblreloctypecheck.c >>>> @@ -32,10 +32,14 @@ >>>> #endif >>>> >>>> #include <libeblP.h> >>>> - >>>> +#include <libelfP.h> >>>> >>>> bool >>>> ebl_reloc_type_check (Ebl *ebl, int reloc) >>>> { >>>> - return ebl != NULL ? ebl->reloc_type_check (reloc) : false; >>>> + int relocNew = reloc; >>>> + GElf_Ehdr ehdr; >>>> + if(ebl->elf->class == ELFCLASS64 && gelf_getehdr(ebl->elf, &ehdr) != >>>> NULL && ehdr.e_machine == EM_MIPS) >>>> + relocNew = ELF64_MIPS_R_TYPE(reloc); >>>> + return ebl != NULL ? ebl->reloc_type_check (relocNew) : false; >>>> } >>> This should not go into the generic ebl_reloc_type_check but has to be >>> hooked so it uses a mips_reloc_type_check. >>> >>>> diff --git a/libebl/eblreloctypename.c b/libebl/eblreloctypename.c >>>> index e53ec0c0..4276d8e3 100644 >>>> --- a/libebl/eblreloctypename.c >>>> +++ b/libebl/eblreloctypename.c >>>> @@ -33,14 +33,18 @@ >>>> >>>> #include <stdio.h> >>>> #include <libeblP.h> >>>> - >>>> +#include <libelfP.h> >>>> >>>> const char * >>>> ebl_reloc_type_name (Ebl *ebl, int reloc, char *buf, size_t len) >>>> { >>>> const char *res; >>>> + int relocNew = reloc; >>>> + GElf_Ehdr ehdr; >>>> + if(ebl->elf->class == ELFCLASS64 && gelf_getehdr(ebl->elf, &ehdr) != >>>> NULL && ehdr.e_machine == EM_MIPS) >>>> + relocNew = ELF64_MIPS_R_TYPE(reloc); >>>> >>>> - res = ebl != NULL ? ebl->reloc_type_name (reloc, buf, len) : NULL; >>>> + res = ebl != NULL ? ebl->reloc_type_name (relocNew, buf, len) : NULL; >>>> if (res == NULL) >>>> /* There are no generic relocation type names. */ >>>> res = "<INVALID RELOC>"; >>> Likewise for hooking reloc_type_name. >>> >> The function reloc_type_check and reloc_type_name were common hooks in file >> backends/common-reloc.c, so if we also need a new hook for mips and copy the >> check codes from common-reloc.c? >> >> Thanks, >> >> Ying >> >>