G'day, All.

First post so please be gentle ;-). Are the barracudas here?

Summary:

Module link-elf will link against static symbols and will fail if the kernel is 
not compiled with DDB or the required MODULE_DEPEND has been stripped of local 
symbols, see nm -g miibus.ko. I propose that we add a sysctl & associated boot 
arg that only allows kmod loading against externally visible symbols. Then in 
11 we can enable this flag by default.

In Detail:

Due to another bug in sys/conf/kmod.mk, 
(http://www.freebsd.org/cgi/query-pr.cgi?pr=177008, contains a patch) the 
miibus.ko exports no symbols.  I.e. symbols are 'static'. 

sys/kern/link-elf.c:link_elf_lookup_symbol() is the culprit. After determining 
that an external symbol can't be found, it does the following.

        /* If we have not found it, look at the full table (if loaded) */
        if (ef->symtab == ef->ddbsymtab)
                return (ENOENT);

        /* Exhaustive search */
        for (i = 0, symp = ef->ddbsymtab; i < ef->ddbsymcnt; i++, symp++) {
                strp = ef->ddbstrtab + symp->st_name;
                if (strcmp(name, strp) == 0) {
                        if (symp->st_shndx != SHN_UNDEF ||
                            (symp->st_value != 0 &&
                             ELF_ST_TYPE(symp->st_info) == STT_FUNC)) {
                                *sym = (c_linker_sym_t) symp;
                                return (0);
                        }
                        return (ENOENT);
                }
        }

This code walks the ddbsymtab looking for any symbol, including locals.

Any kernel that is not built with DDB or any MODULE_DEPEND dependency .ko that 
is stripped will break module loading.


Godfrey van der Linden
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to