diff options
| author | Peter Oberparleiter <oberpar@linux.vnet.ibm.com> | 2009-06-17 16:28:03 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-18 13:03:57 -0700 | 
| commit | b99b87f70c7785ab1e253c6220f4b0b57ce3a7f7 (patch) | |
| tree | ec5688052334448ec8edd3a1a9cb95cd68501ac7 /init/main.c | |
| parent | e24aca672ff06aff0e6a1045efab86043ea5f735 (diff) | |
| download | olio-linux-3.10-b99b87f70c7785ab1e253c6220f4b0b57ce3a7f7.tar.xz olio-linux-3.10-b99b87f70c7785ab1e253c6220f4b0b57ce3a7f7.zip  | |
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>
Diffstat (limited to 'init/main.c')
| -rw-r--r-- | init/main.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/init/main.c b/init/main.c index 0e7aedeaa05..1a65fdd0631 100644 --- a/init/main.c +++ b/init/main.c @@ -720,6 +720,17 @@ asmlinkage void __init start_kernel(void)  	rest_init();  } +/* Call all constructor functions linked into the kernel. */ +static void __init do_ctors(void) +{ +#ifdef CONFIG_CONSTRUCTORS +	ctor_fn_t *call = (ctor_fn_t *) __ctors_start; + +	for (; call < (ctor_fn_t *) __ctors_end; call++) +		(*call)(); +#endif +} +  int initcall_debug;  core_param(initcall_debug, initcall_debug, bool, 0644); @@ -800,6 +811,7 @@ static void __init do_basic_setup(void)  	usermodehelper_init();  	driver_init();  	init_irq_proc(); +	do_ctors();  	do_initcalls();  }  |