kld not work on Atheros
John Baldwin
jhb at freebsd.org
Thu Feb 1 20:06:14 UTC 2018
On Wednesday, January 31, 2018 02:12:42 PM Adrian Chadd wrote:
> Hi,
>
> Bump - do I just put in an #ifdef MIPS around this workaround for now,
> or what's the cleaner solution? :)
Cleaner solution is to not load reltabs or relatabs for sections that don't
have SHF_ALLOC set. That is, earlier in load_elf_obj.c (in loader) and
in link_elf_obj.c when looping over SHT_RELTAB and SHT_RELTABA sections,
ignore relocation tables whose associated section doesn't have SHF_ALLOC
set.
Try this (untested):
diff --git a/stand/common/load_elf_obj.c b/stand/common/load_elf_obj.c
index b58dde0dfbf8..4c893e17a5b1 100644
--- a/stand/common/load_elf_obj.c
+++ b/stand/common/load_elf_obj.c
@@ -282,6 +282,8 @@ __elfN(obj_loadimage)(struct preloaded_file *fp, elf_file_t ef, u_int64_t off)
switch (shdr[i].sh_type) {
case SHT_REL:
case SHT_RELA:
+ if ((shdr[shdr[i].sh_info].sh_flags & SHF_ALLOC) == 0)
+ break;
lastaddr = roundup(lastaddr, shdr[i].sh_addralign);
shdr[i].sh_addr = (Elf_Addr)lastaddr;
lastaddr += shdr[i].sh_size;
diff --git a/sys/kern/link_elf_obj.c b/sys/kern/link_elf_obj.c
index 448d5b9c08a5..0bcec40822e1 100644
--- a/sys/kern/link_elf_obj.c
+++ b/sys/kern/link_elf_obj.c
@@ -272,9 +272,17 @@ link_elf_link_preload(linker_class_t cls, const char *filename,
symstrindex = shdr[i].sh_link;
break;
case SHT_REL:
+ /*
+ * Ignore relocation tables for sections not
+ * loaded by the loader.
+ */
+ if (shdr[shdr[i].sh_info].sh_addr == 0)
+ break;
ef->nreltab++;
break;
case SHT_RELA:
+ if (shdr[shdr[i].sh_info].sh_addr == 0)
+ break;
ef->nrelatab++;
break;
}
@@ -398,12 +406,16 @@ link_elf_link_preload(linker_class_t cls, const char *filename,
pb++;
break;
case SHT_REL:
+ if (shdr[shdr[i].sh_info].sh_addr == 0)
+ break;
ef->reltab[rl].rel = (Elf_Rel *)shdr[i].sh_addr;
ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
ef->reltab[rl].sec = shdr[i].sh_info;
rl++;
break;
case SHT_RELA:
+ if (shdr[shdr[i].sh_info].sh_addr == 0)
+ break;
ef->relatab[ra].rela = (Elf_Rela *)shdr[i].sh_addr;
ef->relatab[ra].nrela =
shdr[i].sh_size / sizeof(Elf_Rela);
@@ -620,9 +632,17 @@ link_elf_load_file(linker_class_t cls, const char *filename,
symstrindex = shdr[i].sh_link;
break;
case SHT_REL:
+ /*
+ * Ignore relocation tables for unallocated
+ * sections.
+ */
+ if ((shdr[shdr[i].sh_info].sh_flags & SHF_ALLOC) == 0)
+ break;
ef->nreltab++;
break;
case SHT_RELA:
+ if ((shdr[shdr[i].sh_info].sh_flags & SHF_ALLOC) == 0)
+ break;
ef->nrelatab++;
break;
case SHT_STRTAB:
@@ -880,6 +900,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
pb++;
break;
case SHT_REL:
+ if ((shdr[shdr[i].sh_info].sh_flags & SHF_ALLOC) == 0)
+ break;
ef->reltab[rl].rel = malloc(shdr[i].sh_size, M_LINKER,
M_WAITOK);
ef->reltab[rl].nrel = shdr[i].sh_size / sizeof(Elf_Rel);
@@ -898,6 +920,8 @@ link_elf_load_file(linker_class_t cls, const char *filename,
rl++;
break;
case SHT_RELA:
+ if ((shdr[shdr[i].sh_info].sh_flags & SHF_ALLOC) == 0)
+ break;
ef->relatab[ra].rela = malloc(shdr[i].sh_size, M_LINKER,
M_WAITOK);
ef->relatab[ra].nrela =
--
John Baldwin
More information about the freebsd-mips
mailing list