Hi, Youling On Sat, Apr 1, 2023 at 11:19 AM Youling Tang <tangyoul...@loongson.cn> wrote: > > Add handling of _GLOBAL_OFFSET_TABLE_. > > Before applying the patch: > $ ./src/elflint --gnu-ld ./src/elflint > section [35] '.symtab': _GLOBAL_OFFSET_TABLE_ symbol value 0x68548 > does not match .got.plt section address 0x68238 > > After applying the patch: > $ ./src/elflint --gnu-ld ./src/elflint > No errors > > Signed-off-by: Liwei Ge <geli...@openanolis.org> > Signed-off-by: Youling Tang <tangyoul...@loongson.cn> > --- > backends/ChangeLog | 4 ++++ > backends/loongarch_init.c | 1 + > backends/loongarch_symbol.c | 35 +++++++++++++++++++++++++++++++++++ > 3 files changed, 40 insertions(+) > > diff --git a/backends/ChangeLog b/backends/ChangeLog > index 81f08314..41071953 100644 > --- a/backends/ChangeLog > +++ b/backends/ChangeLog > @@ -1,3 +1,7 @@ > +2023-04-01 Youling Tang <tangyoul...@loongson.cn> > + * loongarch_init.c (loongarch_init): Hook check_special_symbol. > + * loongarch_symbol.c (loongarch_check_special_symbol): New function. > + > 2023-02-07 Mark Wielaard <m...@klomp.org> > > * libebl_CPU.h (dwarf_peeled_die_type): Explicitly handle > diff --git a/backends/loongarch_init.c b/backends/loongarch_init.c > index 59d8cc3d..b641b07f 100644 > --- a/backends/loongarch_init.c > +++ b/backends/loongarch_init.c > @@ -46,6 +46,7 @@ loongarch_init (Elf *elf __attribute__ ((unused)), > loongarch_init_reloc (eh); > HOOK (eh, reloc_simple_type); > HOOK (eh, machine_flag_check); > + HOOK (eh, check_special_symbol); > > return eh; > } > diff --git a/backends/loongarch_symbol.c b/backends/loongarch_symbol.c > index 43306ab8..5ce55bad 100644 > --- a/backends/loongarch_symbol.c > +++ b/backends/loongarch_symbol.c > @@ -79,3 +79,38 @@ loongarch_machine_flag_check (GElf_Word flags) > return ((flags &~ (EF_LARCH_ABI_MODIFIER_MASK > | EF_LARCH_OBJABI_V1)) == 0); > } > + > +/* Check whether given symbol's st_value and st_size are OK despite failing > + normal checks. */ > +bool > +loongarch_check_special_symbol (Elf *elf, const GElf_Sym *sym, > + const char *name, const GElf_Shdr *destshdr) > +{ > + if (name != NULL > + && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0) > + { > + size_t shstrndx; > + if (elf_getshdrstrndx (elf, &shstrndx) != 0) > + return false; > + const char *sname = elf_strptr (elf, shstrndx, destshdr->sh_name); > + if (sname != NULL > + && (strcmp (sname, ".got") == 0 || strcmp (sname, ".got.plt") == 0)) > + { > + Elf_Scn *scn = NULL; > + while ((scn = elf_nextscn (elf, scn)) != NULL) > + { > + GElf_Shdr shdr_mem; > + GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem); > + if (shdr != NULL) > + { > + sname = elf_strptr (elf, shstrndx, shdr->sh_name); > + if (sname != NULL && strcmp (sname, ".got") == 0) > + return (sym->st_value >= shdr->sh_addr > + && sym->st_value < shdr->sh_addr + shdr->sh_size); > + } > + } > + } > + } > + > + return false; > +} > -- > 2.37.1 >
I've tested this locally, but still remains one error: section [34] '.symtab': _DYNAMIC symbol size 0 does not match dynamic segment size 480 Cheers, --- Hengqi