diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c --- a/sys/kern/link_elf.c +++ b/sys/kern/link_elf.c @@ -715,6 +715,10 @@ if (rel) { rellim = (const Elf_Rel *)((const char *)ef->rel + ef->relsize); while (rel < rellim) { + if (rel->r_offset >= lf->size) { + rel++; + continue; + } if (elf_reloc(lf, (Elf_Addr)ef->address, rel, ELF_RELOC_REL, elf_lookup)) { symname = symbol_name(ef, rel->r_info); kprintf("link_elf: symbol %s undefined\n", symname); @@ -729,6 +733,10 @@ if (rela) { relalim = (const Elf_Rela *)((const char *)ef->rela + ef->relasize); while (rela < relalim) { + if (rela->r_offset >= lf->size) { + rela++; + continue; + } if (elf_reloc(lf, (Elf_Addr)ef->address, rela, ELF_RELOC_RELA, elf_lookup)) { symname = symbol_name(ef, rela->r_info); kprintf("link_elf: symbol %s undefined\n", symname);