For all CONFIG_CFI+CONFIG_CALL_PADDING configs, for C functions, the __cfi_ symbols only cover the 5-byte kCFI type hash. After that there also N bytes of NOP padding between the hash and the function entry which aren't associated with any symbol. The NOPs can be replaced with actual code at runtime. Without a symbol, unwinders and tooling have no way of knowing where those bytes belong. Grow the existing __cfi_* symbols to fill that gap. Note that assembly functions with SYM_TYPED_FUNC_START() aren't affected by this issue, their __cfi_ symbols also cover the padding. Also, CONFIG_PREFIX_SYMBOLS has no reason to exist: CONFIG_CALL_PADDING is what causes the compiler to emit NOP padding before function entry (via -fpatchable-function-entry), so it's the right condition for creating prefix symbols. Remove CONFIG_PREFIX_SYMBOLS, as it's no longer needed. Simplify the LONGEST_SYM_KUNIT_TEST dependency accordingly. Rework objtool's arguments a bit to handle the variety of prefix/cfi-related cases.
Showing the changes to scripts (1 of 8 files). Show all
Unified · Split
| @@ -187,7 +187,11 @@ objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK) += --hacks=jump_label · 186 unmodified lines | |||
| 187 | objtool-args-$(CONFIG_HAVE_NOINSTR_HACK) += --hacks=noinstr | 187 | objtool-args-$(CONFIG_HAVE_NOINSTR_HACK) += --hacks=noinstr |
| 188 | objtool-args-$(CONFIG_MITIGATION_CALL_DEPTH_TRACKING) += --hacks=skylake | 188 | objtool-args-$(CONFIG_MITIGATION_CALL_DEPTH_TRACKING) += --hacks=skylake |
| 189 | objtool-args-$(CONFIG_X86_KERNEL_IBT) += --ibt | 189 | objtool-args-$(CONFIG_X86_KERNEL_IBT) += --ibt |
| 190 | objtool-args-$(CONFIG_FINEIBT) += --cfi | 190 | objtool-args-$(CONFIG_CALL_PADDING) += --prefix=$(CONFIG_FUNCTION_PADDING_BYTES) |
| 191 | ifdef CONFIG_CALL_PADDING | ||
| 192 | objtool-args-$(CONFIG_CFI) += --cfi | ||
| 193 | objtool-args-$(CONFIG_FINEIBT) += --fineibt | ||
| 194 | endif | ||
| 191 | objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL) += --mcount | 195 | objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL) += --mcount |
| 192 | ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL | 196 | ifdef CONFIG_FTRACE_MCOUNT_USE_OBJTOOL |
| 193 | objtool-args-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT) += --mnop | 197 | objtool-args-$(CONFIG_HAVE_OBJTOOL_NOP_MCOUNT) += --mnop |
| @@ -200,7 +204,6 @@ objtool-args-$(CONFIG_STACK_VALIDATION) += --stackval · 6 unmodified lines | |||
| 200 | objtool-args-$(CONFIG_HAVE_STATIC_CALL_INLINE) += --static-call | 204 | objtool-args-$(CONFIG_HAVE_STATIC_CALL_INLINE) += --static-call |
| 201 | objtool-args-$(CONFIG_HAVE_UACCESS_VALIDATION) += --uaccess | 205 | objtool-args-$(CONFIG_HAVE_UACCESS_VALIDATION) += --uaccess |
| 202 | objtool-args-$(or $(CONFIG_GCOV_KERNEL),$(CONFIG_KCOV)) += --no-unreachable | 206 | objtool-args-$(or $(CONFIG_GCOV_KERNEL),$(CONFIG_KCOV)) += --no-unreachable |
| 203 | objtool-args-$(CONFIG_PREFIX_SYMBOLS) += --prefix=$(CONFIG_FUNCTION_PADDING_BYTES) | ||
| 204 | objtool-args-$(CONFIG_OBJTOOL_WERROR) += --werror | 207 | objtool-args-$(CONFIG_OBJTOOL_WERROR) += --werror |
| 205 | 208 | ||
| 206 | objtool-args = $(objtool-args-y) \ | 209 | objtool-args = $(objtool-args-y) \ |