Messages in this thread | | | From | Mike Frysinger <> | Date | Thu, 18 Jun 2009 11:24:44 -0400 | Subject | module version magic and arches with symbol prefixes |
| |
the current check_modstruct_version() does this: { const unsigned long *crc;
if (!find_symbol("module_layout", NULL, &crc, true, false)) BUG(); return check_version(sechdrs, versindex, "module_layout", mod, crc); } the trouble here is that it looks for a literal "module_layout" symbol and for ports that have symbol prefixes (a quick check shows Blackfin & h8300), this aint going to work.
i tried to hack it in the Blackfin port by add this to the linker script: module_layout = _module_layout but that didnt seem to work. maybe kallsysms couldnt find it or i need to hack a different name ...
we could add a new function to asm-generic/sections.h: #ifndef arch_symbol_name #define arch_symbol_name(sym) sym #endif and in the case of Blackfin systems, we'd do: #define arch_symbol_name(sym) "_" sym
no other consumer of find_symbol() has a problem because they're all dynamic -- they scan the modules for required symbols and then scan the kernel for those, so all the symbol prefixes line up.
that would fix the find_symbol() invocation, and check_version() wouldnt need changing because in that case, it's look for the literal symbol that scripts/mod/modpost.c is adding -- "module_layout" in this case.
also, using BUG() here seems pretty damn harsh. wouldnt it make more sense to do something like: if (WARN_ON(!find_symbol("module_layout", NULL, &crc, true, false))) return 0; this way the module is simply not loaded rather than killing the kernel -mike
| |