kbuild: keep data tables through dead code elimination
authorNicholas Piggin <npiggin@gmail.com>
Wed, 23 Nov 2016 16:41:41 +0000 (03:41 +1100)
committerMichal Marek <mmarek@suse.com>
Tue, 29 Nov 2016 14:58:57 +0000 (15:58 +0100)
When CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is enabled we must ensure
that we still keep various programatically-accessed tables.

[npiggin: Fold Paul's patches into one, and add a few more tables.
 diff symbol tables of allyesconfig with/without -gc-sections shows up
 lost tables quite easily.]

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Michal Marek <mmarek@suse.com>
include/asm-generic/vmlinux.lds.h

index 30747960bc54a29496eb134ebff26bfcb67e2fd7..5372775161d0d5879fcefc806815bfa253e8ebaf 100644 (file)
 #ifdef CONFIG_KPROBES
 #define KPROBE_BLACKLIST()     . = ALIGN(8);                                 \
                                VMLINUX_SYMBOL(__start_kprobe_blacklist) = .; \
-                               *(_kprobe_blacklist)                          \
+                               KEEP(*(_kprobe_blacklist))                    \
                                VMLINUX_SYMBOL(__stop_kprobe_blacklist) = .;
 #else
 #define KPROBE_BLACKLIST()
 #ifdef CONFIG_EVENT_TRACING
 #define FTRACE_EVENTS()        . = ALIGN(8);                                   \
                        VMLINUX_SYMBOL(__start_ftrace_events) = .;      \
-                       *(_ftrace_events)                               \
+                       KEEP(*(_ftrace_events))                         \
                        VMLINUX_SYMBOL(__stop_ftrace_events) = .;       \
                        VMLINUX_SYMBOL(__start_ftrace_enum_maps) = .;   \
-                       *(_ftrace_enum_map)                             \
+                       KEEP(*(_ftrace_enum_map))                       \
                        VMLINUX_SYMBOL(__stop_ftrace_enum_maps) = .;
 #else
 #define FTRACE_EVENTS()
 
 #ifdef CONFIG_TRACING
 #define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .;      \
-                        *(__trace_printk_fmt) /* Trace_printk fmt' pointer */ \
+                        KEEP(*(__trace_printk_fmt)) /* Trace_printk fmt' pointer */ \
                         VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
 #define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \
-                        *(__tracepoint_str) /* Trace_printk fmt' pointer */ \
+                        KEEP(*(__tracepoint_str)) /* Trace_printk fmt' pointer */ \
                         VMLINUX_SYMBOL(__stop___tracepoint_str) = .;
 #else
 #define TRACE_PRINTKS()
 #ifdef CONFIG_FTRACE_SYSCALLS
 #define TRACE_SYSCALLS() . = ALIGN(8);                                 \
                         VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
-                        *(__syscalls_metadata)                         \
+                        KEEP(*(__syscalls_metadata))                   \
                         VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
 #else
 #define TRACE_SYSCALLS()
 #ifdef CONFIG_SERIAL_EARLYCON
 #define EARLYCON_TABLE() STRUCT_ALIGN();                       \
                         VMLINUX_SYMBOL(__earlycon_table) = .;  \
-                        *(__earlycon_table)                    \
+                        KEEP(*(__earlycon_table))              \
                         VMLINUX_SYMBOL(__earlycon_table_end) = .;
 #else
 #define EARLYCON_TABLE()
 #define _OF_TABLE_1(name)                                              \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__##name##_of_table) = .;                        \
-       *(__##name##_of_table)                                          \
-       *(__##name##_of_table_end)
+       KEEP(*(__##name##_of_table))                                    \
+       KEEP(*(__##name##_of_table_end))
 
 #define CLKSRC_OF_TABLES()     OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
 #define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
 #define ACPI_PROBE_TABLE(name)                                         \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__##name##_acpi_probe_table) = .;                \
-       *(__##name##_acpi_probe_table)                                  \
+       KEEP(*(__##name##_acpi_probe_table))                            \
        VMLINUX_SYMBOL(__##name##_acpi_probe_table_end) = .;
 #else
 #define ACPI_PROBE_TABLE(name)
 #define KERNEL_DTB()                                                   \
        STRUCT_ALIGN();                                                 \
        VMLINUX_SYMBOL(__dtb_start) = .;                                \
-       *(.dtb.init.rodata)                                             \
+       KEEP(*(.dtb.init.rodata))                                       \
        VMLINUX_SYMBOL(__dtb_end) = .;
 
 /*
        /* implement dynamic printk debug */                            \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__start___jump_table) = .;                       \
-       *(__jump_table)                                                 \
+       KEEP(*(__jump_table))                                           \
        VMLINUX_SYMBOL(__stop___jump_table) = .;                        \
        . = ALIGN(8);                                                   \
        VMLINUX_SYMBOL(__start___verbose) = .;                          \
-       *(__verbose)                                                    \
+       KEEP(*(__verbose))                                              \
        VMLINUX_SYMBOL(__stop___verbose) = .;                           \
        LIKELY_PROFILE()                                                \
        BRANCH_PROFILE()                                                \
                VMLINUX_SYMBOL(__start_rodata) = .;                     \
                *(.rodata) *(.rodata.*)                                 \
                RO_AFTER_INIT_DATA      /* Read only after init */      \
-               *(__vermagic)           /* Kernel version magic */      \
+               KEEP(*(__vermagic))     /* Kernel version magic */      \
                . = ALIGN(8);                                           \
                VMLINUX_SYMBOL(__start___tracepoints_ptrs) = .;         \
-               *(__tracepoints_ptrs)   /* Tracepoints: pointer array */\
+               KEEP(*(__tracepoints_ptrs)) /* Tracepoints: pointer array */ \
                VMLINUX_SYMBOL(__stop___tracepoints_ptrs) = .;          \
                *(__tracepoints_strings)/* Tracepoints: strings */      \
        }                                                               \
        /* PCI quirks */                                                \
        .pci_fixup        : AT(ADDR(.pci_fixup) - LOAD_OFFSET) {        \
                VMLINUX_SYMBOL(__start_pci_fixups_early) = .;           \
-               *(.pci_fixup_early)                                     \
+               KEEP(*(.pci_fixup_early))                               \
                VMLINUX_SYMBOL(__end_pci_fixups_early) = .;             \
                VMLINUX_SYMBOL(__start_pci_fixups_header) = .;          \
-               *(.pci_fixup_header)                                    \
+               KEEP(*(.pci_fixup_header))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_header) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_final) = .;           \
-               *(.pci_fixup_final)                                     \
+               KEEP(*(.pci_fixup_final))                               \
                VMLINUX_SYMBOL(__end_pci_fixups_final) = .;             \
                VMLINUX_SYMBOL(__start_pci_fixups_enable) = .;          \
-               *(.pci_fixup_enable)                                    \
+               KEEP(*(.pci_fixup_enable))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_enable) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_resume) = .;          \
-               *(.pci_fixup_resume)                                    \
+               KEEP(*(.pci_fixup_resume))                              \
                VMLINUX_SYMBOL(__end_pci_fixups_resume) = .;            \
                VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .;    \
-               *(.pci_fixup_resume_early)                              \
+               KEEP(*(.pci_fixup_resume_early))                        \
                VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .;      \
                VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .;         \
-               *(.pci_fixup_suspend)                                   \
+               KEEP(*(.pci_fixup_suspend))                             \
                VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .;           \
                VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .;    \
-               *(.pci_fixup_suspend_late)                              \
+               KEEP(*(.pci_fixup_suspend_late))                        \
                VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .;      \
        }                                                               \
                                                                        \
        /* Built-in firmware blobs */                                   \
        .builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {      \
                VMLINUX_SYMBOL(__start_builtin_fw) = .;                 \
-               *(.builtin_fw)                                          \
+               KEEP(*(.builtin_fw))                                    \
                VMLINUX_SYMBOL(__end_builtin_fw) = .;                   \
        }                                                               \
                                                                        \
                                                                        \
        /* Kernel symbol table: strings */                              \
         __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) {        \
-               KEEP(*(__ksymtab_strings))                              \
+               *(__ksymtab_strings)                                    \
        }                                                               \
                                                                        \
        /* __*init sections */                                          \
        /* Built-in module parameters. */                               \
        __param : AT(ADDR(__param) - LOAD_OFFSET) {                     \
                VMLINUX_SYMBOL(__start___param) = .;                    \
-               *(__param)                                              \
+               KEEP(*(__param))                                        \
                VMLINUX_SYMBOL(__stop___param) = .;                     \
        }                                                               \
                                                                        \
        /* Built-in module versions. */                                 \
        __modver : AT(ADDR(__modver) - LOAD_OFFSET) {                   \
                VMLINUX_SYMBOL(__start___modver) = .;                   \
-               *(__modver)                                             \
+               KEEP(*(__modver))                                       \
                VMLINUX_SYMBOL(__stop___modver) = .;                    \
                . = ALIGN((align));                                     \
                VMLINUX_SYMBOL(__end_rodata) = .;                       \
        . = ALIGN(align);                                               \
        __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {               \
                VMLINUX_SYMBOL(__start___ex_table) = .;                 \
-               *(__ex_table)                                           \
+               KEEP(*(__ex_table))                                     \
                VMLINUX_SYMBOL(__stop___ex_table) = .;                  \
        }
 
 #ifdef CONFIG_CONSTRUCTORS
 #define KERNEL_CTORS() . = ALIGN(8);                      \
                        VMLINUX_SYMBOL(__ctors_start) = .; \
-                       *(.ctors)                          \
-                       *(SORT(.init_array.*))             \
-                       *(.init_array)                     \
+                       KEEP(*(.ctors))                    \
+                       KEEP(*(SORT(.init_array.*)))       \
+                       KEEP(*(.init_array))               \
                        VMLINUX_SYMBOL(__ctors_end) = .;
 #else
 #define KERNEL_CTORS()
        . = ALIGN(8);                                                   \
        __bug_table : AT(ADDR(__bug_table) - LOAD_OFFSET) {             \
                VMLINUX_SYMBOL(__start___bug_table) = .;                \
-               *(__bug_table)                                          \
+               KEEP(*(__bug_table))                                    \
                VMLINUX_SYMBOL(__stop___bug_table) = .;                 \
        }
 #else
        . = ALIGN(4);                                                   \
        .tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) {               \
                VMLINUX_SYMBOL(__tracedata_start) = .;                  \
-               *(.tracedata)                                           \
+               KEEP(*(.tracedata))                                     \
                VMLINUX_SYMBOL(__tracedata_end) = .;                    \
        }
 #else
 #define INIT_SETUP(initsetup_align)                                    \
                . = ALIGN(initsetup_align);                             \
                VMLINUX_SYMBOL(__setup_start) = .;                      \
-               *(.init.setup)                                          \
+               KEEP(*(.init.setup))                                    \
                VMLINUX_SYMBOL(__setup_end) = .;
 
 #define INIT_CALLS_LEVEL(level)                                                \