kld not work on Atheros
Mori Hiroki
yamori813 at yahoo.co.jp
Thu Feb 8 11:01:54 UTC 2018
Hi
Sorry too late reply.
I try to head code now. Work fine. Thanks.
Hiroki Mori
----- Original Message -----
> From: John Baldwin <jhb at freebsd.org>
> To: Adrian Chadd <adrian at freebsd.org>
> Cc: Michael Zhilin <mizhka at gmail.com>; Mori Hiroki <yamori813 at yahoo.co.jp>; "freebsd-mips at freebsd.org" <freebsd-mips at freebsd.org>
> Date: 2018/2/2, Fri 05:06
> Subject: Re: kld not work on Atheros
>
> 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