module names fix
Subsystems (2)
PATCH 1/1 module names fix
Linus, please apply. Gives every module its proper name (620-odd here, all worked fine with this patch). Also fixes a couple of modules which predeclared init_module() which broke my previous complex macro.
Rusty.
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
Name: Module Name Solution
Author: Kai Germaschewski
D: Well, I have another solution, which doesn't need additional Makefile
D: magic or anything.
D:
D: I just put the module name into each .o file where <linux/module.h> is
D: included. Putting it into the section .gnu.linkonce.modname has the effect
D: that even for multi-part modules, we only end up with one copy of the
D: name.
D:
D: Caveat: I'm using the preprocessor macro KBUILD_MODNAME to know what to
D: put into .gnu.linkonce.modname. The following used to happen:
D:
D: (drivers/isdn/eicon/Makefile)
D:
D: divas-objs := common.o Divas_mod.o ...
D: eicon-objs := common.o eicon_mod.o ...
D:
D: Divas_mod.o is compiled with -DKBUILD_MODNAME=divas
D: eicon_mod.o is compiled with -DKBUILD_MODNAME=eicon
D: common.o is compiled with -DKBUILD_MODNAME=divas_eicon
D:
D: So in the case above, both divas.o and eicon.o would end up with
D: a .gnu.linkonce.modname section containing "divas_eicon"
D:
D: My fix to this is to not define KBUILD_MODNAME when compiling an object
D: whilch will be linked into more than one module - so common.o gets no
D: .gnu.linkonce.modname section at all. Works fine here.
D:
D: Now, doing this I remove one of the reasons why we would need modules
D: linked as '.ko' ;), but it seems much cleaner than generating a temporary
D: file, using objcopy etc.
include/linux/init.h +0 -16
@@ -125,14 +125,6 @@ extern struct kernel_param __setup_start*/ #define module_exit (x) __exitcall(x); -/** -* no_module_init - code needs no initialization. -* -* The equivalent of declaring an empty init function which returns 0. -* Every module must have exactly one module_init() or no_module_init -* invocation. */ -#define no_module_init -#else /* MODULE */ /* Don't use these in modules, but some people do... */
@@ -144,11 +136,6 @@ extern struct kernel_param __setup_start#define device_initcall (fn) module_init(fn)#define late_initcall (fn) module_init(fn) -/* Each module knows its own name. */ -#define __DEFINE_MODULE_NAME \ - char __module_name[] __attribute__((section(".modulename"))) = \ - __stringify(KBUILD_MODNAME) -/* These macros create a dummy inline: gcc 2.9x does not count alias as usage, hence the `unused function' warning when __init functions are declared static. We use the dummy __*_module_inline functions
@@ -157,12 +144,9 @@ extern struct kernel_param __setup_start/* Each module must use one module_init(), or one no_module_init */ #define module_init (initfn) \ - __DEFINE_MODULE_NAME; \ static inline initcall_t __inittest(void) \ { return initfn; } \ int __initfn(void) __attribute__((alias(#initfn))); - -#define no_module_init __DEFINE_MODULE_NAME/* This is only required if you want to be unloadable. */ #define module_exit (exitfn) \
include/linux/module.h +6 -6
@@ -40,6 +40,11 @@ struct kernel_symbol#ifdef MODULE +#ifdef KBUILD_MODNAME +static const char __module_name[MODULE_NAME_LEN] __attribute__((section(".gnu.linkonce.modname"))) = \ +__stringify (KBUILD_MODNAME ); +#endif +#define MODULE_GENERIC_TABLE (gtype,name) \ static const unsigned long __module_##gtype##_size \ __attribute__ ((unused)) = sizeof(struct gtype##_id); \
@@ -306,12 +311,7 @@ extern int module_dummy_usage;/* Old-style "I'll just call it init_module and it'll be run at insert". Use module_init(myroutine) instead. */ #ifdef MODULE -/* Used as "int init_module(void) { ... }". Get funky to insert modname. */ -#define init_module (voidarg) \ - __initfn(void); \ - char __module_name[] __attribute__((section(".modulename"))) = \ - __stringify(KBUILD_MODNAME); \ - int __initfn(void) +#define init_module (voidarg) __initfn(void)#define cleanup_module (voidarg) __exitfn(void)#endif
kernel/module.c +2 -2
@@ -864,8 +864,8 @@ static struct module *load_module(void */* Internal symbols */ DEBUGP ("Symbol table in section %u\n" , i); symindex = i; - }else if (strcmp (secstrings+sechdrs[i].sh_name,".modulename" ) - ==0 ) { + }else if (strcmp (secstrings+sechdrs[i].sh_name, +".gnu.linkonce.modname" ) ==0 ) {/* This module's name */ DEBUGP ("Module name in section %u\n" , i); modnameindex = i;
lib/zlib_deflate/deflate_syms.c +0 -2
@@ -19,5 +19,3 @@ EXPORT_SYMBOL(zlib_deflateReset);EXPORT_SYMBOL (zlib_deflateCopy);EXPORT_SYMBOL (zlib_deflateParams);MODULE_LICENSE ("GPL" ); - -no_module_init;
lib/zlib_inflate/inflate_syms.c +0 -2
@@ -20,5 +20,3 @@ EXPORT_SYMBOL(zlib_inflateReset);EXPORT_SYMBOL (zlib_inflateSyncPoint);EXPORT_SYMBOL (zlib_inflateIncomp);MODULE_LICENSE ("GPL" ); - -no_module_init;
scripts/Makefile.lib +3 -3
@@ -124,14 +124,14 @@ depfile = $(subst $(comma),_,$(@D)/.$(@F # than one module. In that case KBUILD_MODNAME will be set to foo_bar, # where foo and bar are the name of the modules. basename_flags = -DKBUILD_BASENAME=$(subst $(comma),_,$(subst -,_,$(*F))) -modname_flags = -DKBUILD_MODNAME=$(subst $(comma),_,$(subst -,_,$(modname))) +modname_flags = $(if $(filter 1,$(words $(modname))),-DKBUILD_MODNAME=$(subst $(comma),_,$(subst -,_,$(modname)))) c_flags = -Wp,-MD,$(depfile) $(CFLAGS) $(NOSTDINC_FLAGS) \ $(modkern_cflags) $(EXTRA_CFLAGS) $(CFLAGS_$(*F).o) \ $(basename_flags) $(modname_flags) $(export_flags) # Finds the multi-part object the current object will be linked into -modname-multi = $(subst $(space),_,$(sort $(foreach m,$(multi-used),\ - $(if $(filter $(subst $(obj)/,,$*.o), $($(m:.o=-objs)) $($(m:.o=-y))),$(m:.o=))))) +modname-multi = $(sort $(foreach m,$(multi-used),\ + $(if $(filter $(subst $(obj)/,,$*.o), $($(m:.o=-objs)) $($(m:.o=-y))),$(m:.o=)))) # Shipped files # ===========================================================================