Embed __this_module in module itself.
PATCH 1/1 Embed __this_module in module itself.
Please check out this patch, which embeds the module structure into the module itself (in ".gnu.linkonce.this_module"). Slight simplification, and gives Dave that page back, as I promised.
Testers welcome,
Rusty.
Name: Embedded __this_module
Author: Rusty Russell
Status: Tested in 2.5.52
D: This makes __this_module a real symbol for modules, rather than
D: allocating at load time. This makes things a little simpler, and
D: also saves about a page on architectures which have their own
D: module allocator (eg. Sparc64).
include/linux/module.h +6 -9
@@ -42,11 +42,6 @@ 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 -/* For replacement modutils, use an alias not a pointer. */ #define MODULE_GENERIC_TABLE (gtype,name) \ static const unsigned long __module_##gtype##_size \
@@ -56,9 +51,6 @@ static const struct gtype##_id * __modul extern const struct gtype##_id __mod_##gtype##_table \ __attribute__ ((unused, alias(__stringify(name)))) -/* This is magically filled in by the linker, but THIS_MODULE must be -a constant so it works in initializers. */ -extern struct module __this_module;#define THIS_MODULE (&__this_module)#else /* !MODULE */
@@ -176,7 +174,7 @@ struct module/* The command line arguments (may be mangled). People like keeping pointers to this stuff */ -char args[0 ]; +char *args; };/* FIXME: It'd be nice to isolate modules during init, too, so they
@@ -288,6 +286,11 @@ static inline const char *module_address return NULL; }#endif /* CONFIG_MODULES */ + +#ifdef MODULE +/* This defines __this_module. */ +#include <linux/thismodule.h> +#endif /* For archs to search exception tables */ extern struct list_head extables;
include/linux/thismodule.h +19 -0
@@ -0,0 +1,19 @@ +#ifndef _LINUX_THISMODULE_H +#define _LINUX_THISMODULE_H +/* This stub is linked into every module. */ + +/* These could be defined in the module, or will resolve to the kernel stubs */ +extern int __initfn (void ); +extern void __exitfn (void ); + +/* We use the linker to do some of the work for us. */ +static struct module __this_module +__attribute__((section(".gnu.linkonce.this_module"))) = { + .name = __stringify(KBUILD_MODNAME), + .symbols = { .owner = &__this_module }, + .init = __initfn, +#ifdef CONFIG_MODULE_UNLOAD + .exit = __exitfn, +#endif +}; +#endif /* MODULE */
kernel/module.c +40 -50
220 lines not on this page · raw message
--
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.
From: Rusty Russell <[email protected]>
Date: Mon, 23 Dec 2002 19:38:41 +1100
Please check out this patch, which embeds the module structure into the module itself (in ".gnu.linkonce.this_module"). Slight simplification, and gives Dave that page back, as I promised.
Looks like the right idea to me Rusty.