mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 05:31:15 +00:00
kernel: constructor support
Call constructors (gcc-generated initcall-like functions) during kernel start and module load. Constructors are e.g. used for gcov data initialization. Disable constructor support for usermode Linux to prevent conflicts with host glibc. Signed-off-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Acked-by: Rusty Russell <rusty@rustcorp.com.au> Acked-by: WANG Cong <xiyou.wangcong@gmail.com> Cc: Sam Ravnborg <sam@ravnborg.org> Cc: Jeff Dike <jdike@addtoit.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Huang Ying <ying.huang@intel.com> Cc: Li Wei <W.Li@Sun.COM> Cc: Michael Ellerman <michaele@au1.ibm.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Heiko Carstens <heicars2@linux.vnet.ibm.com> Cc: Martin Schwidefsky <mschwid2@linux.vnet.ibm.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
e24aca672f
commit
b99b87f70c
7 changed files with 54 additions and 0 deletions
|
@ -2216,6 +2216,10 @@ static noinline struct module *load_module(void __user *umod,
|
|||
mod->unused_gpl_crcs = section_addr(hdr, sechdrs, secstrings,
|
||||
"__kcrctab_unused_gpl");
|
||||
#endif
|
||||
#ifdef CONFIG_CONSTRUCTORS
|
||||
mod->ctors = section_objs(hdr, sechdrs, secstrings, ".ctors",
|
||||
sizeof(*mod->ctors), &mod->num_ctors);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MARKERS
|
||||
mod->markers = section_objs(hdr, sechdrs, secstrings, "__markers",
|
||||
|
@ -2389,6 +2393,17 @@ static noinline struct module *load_module(void __user *umod,
|
|||
goto free_hdr;
|
||||
}
|
||||
|
||||
/* Call module constructors. */
|
||||
static void do_mod_ctors(struct module *mod)
|
||||
{
|
||||
#ifdef CONFIG_CONSTRUCTORS
|
||||
unsigned long i;
|
||||
|
||||
for (i = 0; i < mod->num_ctors; i++)
|
||||
mod->ctors[i]();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* This is where the real work happens */
|
||||
SYSCALL_DEFINE3(init_module, void __user *, umod,
|
||||
unsigned long, len, const char __user *, uargs)
|
||||
|
@ -2417,6 +2432,7 @@ SYSCALL_DEFINE3(init_module, void __user *, umod,
|
|||
blocking_notifier_call_chain(&module_notify_list,
|
||||
MODULE_STATE_COMING, mod);
|
||||
|
||||
do_mod_ctors(mod);
|
||||
/* Start the module */
|
||||
if (mod->init != NULL)
|
||||
ret = do_one_initcall(mod->init);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue