kernel: add support for .init_array.* constructors
authorAndrey Ryabinin <[email protected]>
Fri, 13 Feb 2015 22:40:10 +0000 (14:40 -0800)
committerLinus Torvalds <[email protected]>
Sat, 14 Feb 2015 05:21:42 +0000 (21:21 -0800)
KASan uses constructors for initializing redzones for global variables.
Globals instrumentation in GCC 4.9.2 produces constructors with priority
(.init_array.00099)

Currently kernel ignores such constructors.  Only constructors with
default priority supported (.init_array)

This patch adds support for constructors with priorities.  For kernel
image we put pointers to constructors between __ctors_start/__ctors_end
and do_ctors() will call them on start up.  For modules we merge
.init_array.* sections into resulting .init_array.  Module code properly
handles constructors in .init_array section.

Signed-off-by: Andrey Ryabinin <[email protected]>
Cc: Dmitry Vyukov <[email protected]>
Cc: Konstantin Serebryany <[email protected]>
Cc: Dmitry Chernenkov <[email protected]>
Signed-off-by: Andrey Konovalov <[email protected]>
Cc: Yuri Gribov <[email protected]>
Cc: Konstantin Khlebnikov <[email protected]>
Cc: Sasha Levin <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Joonsoo Kim <[email protected]>
Cc: Dave Hansen <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: "H. Peter Anvin" <[email protected]>
Cc: Christoph Lameter <[email protected]>
Cc: Pekka Enberg <[email protected]>
Cc: David Rientjes <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
include/asm-generic/vmlinux.lds.h
scripts/module-common.lds

index bee5d683074da849f467c1ac23416b8687c5c47f..ac78910d7416c5f7f2a68cfbde0d950d58ab0d9c 100644 (file)
 #define KERNEL_CTORS() . = ALIGN(8);                      \
                        VMLINUX_SYMBOL(__ctors_start) = .; \
                        *(.ctors)                          \
+                       *(SORT(.init_array.*))             \
                        *(.init_array)                     \
                        VMLINUX_SYMBOL(__ctors_end) = .;
 #else
index bec15f908fc6d9191dd776370ece97bb2976976f..73a2c7da0e551dc29d421334061bb9ebad9e8a78 100644 (file)
@@ -16,4 +16,7 @@ SECTIONS {
        __kcrctab_unused        0 : { *(SORT(___kcrctab_unused+*)) }
        __kcrctab_unused_gpl    0 : { *(SORT(___kcrctab_unused_gpl+*)) }
        __kcrctab_gpl_future    0 : { *(SORT(___kcrctab_gpl_future+*)) }
+
+       . = ALIGN(8);
+       .init_array             0 : { *(SORT(.init_array.*)) *(.init_array) }
 }