Date: Fri, 15 Mar 2013 16:46:13 -0700 From: Godfrey Van der Linden <gvdl@juniper.net> To: <freebsd-current@freebsd.org> Subject: kmod linking is very strange Message-ID: <A649469B-7760-42FA-9859-316FA04AFE4E@juniper.net>
next in thread | raw e-mail | index | archive | help
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=3D177008, contains a patch) = the miibus.ko exports no symbols. I.e. symbols are 'static'.=20 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 =3D=3D ef->ddbsymtab) return (ENOENT); /* Exhaustive search */ for (i =3D 0, symp =3D ef->ddbsymtab; i < ef->ddbsymcnt; i++, = symp++) { strp =3D ef->ddbstrtab + symp->st_name; if (strcmp(name, strp) =3D=3D 0) { if (symp->st_shndx !=3D SHN_UNDEF || (symp->st_value !=3D 0 && ELF_ST_TYPE(symp->st_info) =3D=3D = STT_FUNC)) { *sym =3D (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=
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?A649469B-7760-42FA-9859-316FA04AFE4E>