We are aborting a build in case when gcc doesn't support fentry on x86_64 (regs->ip modification can't really reliably work with mcount). This however breaks allmodconfig for people with older gccs that don't support -mfentry. Turn the build-time failure into runtime failure, resulting in the whole infrastructure not being initialized if CC_USING_FENTRY is unset.
Unified · Split
| @@ -25,9 +25,13 @@ · 24 unmodified lines | ||
| 25 | 25 | #include <linux/ftrace.h> |
| 26 | 26 | |
| 27 | 27 | #ifdef CONFIG_LIVE_PATCHING |
| 28 | +static inline int klp_check_compiler_support(void) | |
| 29 | +{ | |
| 28 | 30 | #ifndef CC_USING_FENTRY |
| 29 | −#error Your compiler must support -mfentry for live patching to work | |
| 31 | + return 1; | |
| 30 | 32 | #endif |
| 33 | + return 0; | |
| 34 | +} | |
| 31 | 35 | extern int klp_write_module_reloc(struct module *mod, unsigned long type, |
| 32 | 36 | unsigned long loc, unsigned long value); |
| 33 | 37 | |
| @@ -911,6 +911,12 @@ static int klp_init(void) · 910 unmodified lines | ||
| 911 | 911 | { |
| 912 | 912 | int ret; |
| 913 | 913 | |
| 914 | + ret = klp_check_compiler_support(); | |
| 915 | + if (ret) { | |
| 916 | + pr_info("Your compiler is too old; turning off.\n"); | |
| 917 | + return -EINVAL; | |
| 918 | + } | |
| 919 | + | |
| 914 | 920 | ret = register_module_notifier(&klp_module_nb); |
| 915 | 921 | if (ret) |
| 916 | 922 | return ret; |