Messages in this thread Patch in this message | | | Date | Fri, 4 Aug 2023 10:43:28 +0200 | From | Peter Zijlstra <> | Subject | Re: [PATCH] x86/retpoline,kprobes: Fix "Fix position of thunk sections with CONFIG_LTO_CLANG" |
| |
On Fri, Aug 04, 2023 at 10:28:53AM +0200, Peter Zijlstra wrote: > On Fri, Aug 04, 2023 at 12:03:23AM +0100, Andrew Cooper wrote: > > Lets hope there are no .text..__x86womble sections around. > > > > Fixes: 973ab2d61f33 ("x86/retpoline,kprobes: Fix position of thunk sections with CONFIG_LTO_CLANG") > > Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> > > --- > > CC: Petr Pavlu <petr.pavlu@suse.com> > > CC: Peter Zijlstra (Intel) <peterz@infradead.org> > > CC: Josh Poimboeuf <jpoimboe@kernel.org> > > CC: linux-kernel@vger.kernel.org > > > > Alternatively, > > > > int strstarts(const char *s1, const char *s2) > > { > > return strncmp(s1, s2, strlen(s2)); > > } > > Durr, I hate C ;-/ And yes, we have a ton of it, lemme try that > strstarts thing.
So there, that builds and compiles a kernel, must be good :-)
Now, let me go make some wake-up juice ...
--- tools/objtool/check.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index e096eb325acd..a2b624b580ff 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -20,6 +20,7 @@ #include <linux/hashtable.h> #include <linux/kernel.h> #include <linux/static_call_types.h> +#include <linux/string.h> struct alternative { struct alternative *next; @@ -383,13 +384,13 @@ static int decode_instructions(struct objtool_file *file) if (strcmp(sec->name, ".altinstr_replacement") && strcmp(sec->name, ".altinstr_aux") && - strncmp(sec->name, ".discard.", 9)) + !strstarts(sec->name, ".discard.")) sec->text = true; if (!strcmp(sec->name, ".noinstr.text") || !strcmp(sec->name, ".entry.text") || !strcmp(sec->name, ".cpuidle.text") || - !strncmp(sec->name, ".text..__x86.", 12)) + strstarts(sec->name, ".text..__x86.")) sec->noinstr = true; /* @@ -709,8 +710,7 @@ static int create_static_call_sections(struct objtool_file *file) perror("strdup"); return -1; } - if (strncmp(key_name, STATIC_CALL_TRAMP_PREFIX_STR, - STATIC_CALL_TRAMP_PREFIX_LEN)) { + if (!strstarts(key_name, STATIC_CALL_TRAMP_PREFIX_STR)) { WARN("static_call: trampoline name malformed: %s", key_name); free(key_name); return -1; @@ -900,7 +900,7 @@ static int create_cfi_sections(struct objtool_file *file) if (sym->type != STT_FUNC) continue; - if (strncmp(sym->name, "__cfi_", 6)) + if (!strstarts(sym->name, "__cfi_")) continue; idx++; @@ -916,7 +916,7 @@ static int create_cfi_sections(struct objtool_file *file) if (sym->type != STT_FUNC) continue; - if (strncmp(sym->name, "__cfi_", 6)) + if (!strstarts(sym->name, "__cfi_")) continue; if (!elf_init_reloc_text_sym(file->elf, sec, @@ -2468,7 +2468,7 @@ static bool is_profiling_func(const char *name) /* * Many compilers cannot disable KCOV with a function attribute. */ - if (!strncmp(name, "__sanitizer_cov_", 16)) + if (strstarts(name, "__sanitizer_cov_")) return true; /* @@ -2477,7 +2477,7 @@ static bool is_profiling_func(const char *name) * the __no_sanitize_thread attribute, remove them. Once the kernel's * minimum Clang version is 14.0, this can be removed. */ - if (!strncmp(name, "__tsan_func_", 12) || + if (strstarts(name, "__tsan_func_") || !strcmp(name, "__tsan_atomic_signal_fence")) return true; @@ -2492,8 +2492,7 @@ static int classify_symbols(struct objtool_file *file) if (func->bind != STB_GLOBAL) continue; - if (!strncmp(func->name, STATIC_CALL_TRAMP_PREFIX_STR, - strlen(STATIC_CALL_TRAMP_PREFIX_STR))) + if (strstarts(func->name, STATIC_CALL_TRAMP_PREFIX_STR)) func->static_call_tramp = true; if (arch_is_retpoline(func)) @@ -2528,7 +2527,7 @@ static void mark_rodata(struct objtool_file *file) * .rodata.str1.* sections are ignored; they don't contain jump tables. */ for_each_sec(file, sec) { - if (!strncmp(sec->name, ".rodata", 7) && + if (strstarts(sec->name, ".rodata") && !strstr(sec->name, ".str1.")) { sec->rodata = true; found = true; @@ -3400,7 +3399,7 @@ static inline bool noinstr_call_dest(struct objtool_file *file, * something 'BAD' happened. At the risk of taking the machine down, * let them proceed to get the message out. */ - if (!strncmp(func->name, "__ubsan_handle_", 15)) + if (strstarts(func->name, "__ubsan_handle_")) return true; return false; @@ -3531,8 +3530,8 @@ static int validate_branch(struct objtool_file *file, struct symbol *func, if (func && insn_func(insn) && func != insn_func(insn)->pfunc) { /* Ignore KCFI type preambles, which always fall through */ - if (!strncmp(func->name, "__cfi_", 6) || - !strncmp(func->name, "__pfx_", 6)) + if (strstarts(func->name, "__cfi_") || + strstarts(func->name, "__pfx_")) return 0; WARN("%s() falls through to next function %s()", @@ -4401,9 +4400,9 @@ static int validate_ibt(struct objtool_file *file) * These sections can reference text addresses, but not with * the intent to indirect branch to them. */ - if ((!strncmp(sec->name, ".discard", 8) && + if ((strstarts(sec->name, ".discard") && strcmp(sec->name, ".discard.ibt_endbr_noseal")) || - !strncmp(sec->name, ".debug", 6) || + strstarts(sec->name, ".debug") || !strcmp(sec->name, ".altinstructions") || !strcmp(sec->name, ".ibt_endbr_seal") || !strcmp(sec->name, ".orc_unwind_ip") ||
| |