diff options
| -rw-r--r-- | include/linux/init.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/include/linux/init.h b/include/linux/init.h index e1688802964f..a3ba27076342 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -163,6 +163,23 @@ extern bool initcall_debug; | |||
| 163 | 163 | ||
| 164 | #ifndef __ASSEMBLY__ | 164 | #ifndef __ASSEMBLY__ |
| 165 | 165 | ||
| 166 | #ifdef CONFIG_LTO | ||
| 167 | /* Work around a LTO gcc problem: when there is no reference to a variable | ||
| 168 | * in a module it will be moved to the end of the program. This causes | ||
| 169 | * reordering of initcalls which the kernel does not like. | ||
| 170 | * Add a dummy reference function to avoid this. The function is | ||
| 171 | * deleted by the linker. | ||
| 172 | */ | ||
| 173 | #define LTO_REFERENCE_INITCALL(x) \ | ||
| 174 | ; /* yes this is needed */ \ | ||
| 175 | static __used __exit void *reference_##x(void) \ | ||
| 176 | { \ | ||
| 177 | return &x; \ | ||
| 178 | } | ||
| 179 | #else | ||
| 180 | #define LTO_REFERENCE_INITCALL(x) | ||
| 181 | #endif | ||
| 182 | |||
| 166 | /* initcalls are now grouped by functionality into separate | 183 | /* initcalls are now grouped by functionality into separate |
| 167 | * subsections. Ordering inside the subsections is determined | 184 | * subsections. Ordering inside the subsections is determined |
| 168 | * by link order. | 185 | * by link order. |
| @@ -175,7 +192,8 @@ extern bool initcall_debug; | |||
| 175 | 192 | ||
| 176 | #define __define_initcall(fn, id) \ | 193 | #define __define_initcall(fn, id) \ |
| 177 | static initcall_t __initcall_##fn##id __used \ | 194 | static initcall_t __initcall_##fn##id __used \ |
| 178 | __attribute__((__section__(".initcall" #id ".init"))) = fn | 195 | __attribute__((__section__(".initcall" #id ".init"))) = fn; \ |
| 196 | LTO_REFERENCE_INITCALL(__initcall_##fn##id) | ||
| 179 | 197 | ||
| 180 | /* | 198 | /* |
| 181 | * Early initcalls run before initializing SMP. | 199 | * Early initcalls run before initializing SMP. |
