Re: [PATCH] x86/retpoline,kprobes: Fix "Fix position of thunk sections with CONFIG_LTO_CLANG"
From: Peter Zijlstra
Date: Fri Aug 04 2023 - 04:44:37 EST
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@xxxxxxxxxx>
> > ---
> > CC: Petr Pavlu <petr.pavlu@xxxxxxxx>
> > CC: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx>
> > CC: Josh Poimboeuf <jpoimboe@xxxxxxxxxx>
> > CC: linux-kernel@xxxxxxxxxxxxxxx
> >
> > 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") ||