linker weirdness for MIPS kernel?

Jayachandran C. c.jayachandran at gmail.com
Tue Mar 29 11:35:16 UTC 2011


On Tue, Mar 29, 2011 at 12:45 PM, Adrian Chadd <adrian.chadd at gmail.com> wrote:
> Hi guys,
>
> I'm trying to use modules on my MIPS boards and I'm hitting a snag.
>
> # kldload ./wlan.ko
> # kldload ./ath_hal.ko
> # kldload ./ath_rate_sample.ko
> link_elf_obj: symbol ieee80211_iterate_nodes undefined (1)
> linker_load_file: Unsupported file type
> kldload: can't load ./ath_rate_sample.ko: Exec format error
> # nm ./wlan.ko  | grep ieee80211_iterate_nodes
> 00015edc t ieee80211_iterate_nodes
> # kldstat
> Id Refs Address    Size     Name
>  1    7 0x80000000 80000000 kernel
>  2    1 0xc7b4e000 538e4    wlan.ko
>  3    1 0xc7ba2000 70b88    ath_hal.ko
> #
>
> So the wlan module is loaded, it has that symbol internally, but the linker
> isn't gluing them together. That (1) is a local patch of mine to figure out
> where it's broken - here, it's broken in link_elf_obj.c:1038 . Ie, it's the
> first loop in relocate_file().
>
> I'm not up to date on how all this ELF and kernel module/linker magic works,
> could someone please give me a hand diagnosing why this is happening?

There was an issue we had seen in link_elf.c in another context, the value we
have for linker_kernel_file->address is not correct for mips, it should be
actually the KERNLOADADDR in config file.

Not really sure if your problem is related, but here is a small hack/patch to
try:

diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 1e0bac1..14dfe9e 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -323,7 +323,11 @@ link_elf_init(void* arg)

        if (dp != NULL)
                parse_dynamic(ef);
+#ifdef __mips__
+       linker_kernel_file->address = (caddr_t) 0xffffffff80100000;
+#else
        linker_kernel_file->address = (caddr_t) KERNBASE;
+#endif
        linker_kernel_file->size = -(intptr_t)linker_kernel_file->address;

        if (modptr != NULL) {
--


JC.


More information about the freebsd-mips mailing list