return kallsyms_relative_base - 1 - kallsyms_offsets[idx];
 }
 
-#if defined(CONFIG_CFI_CLANG) && defined(CONFIG_LTO_CLANG_THIN)
-/*
- * LLVM appends a hash to static function names when ThinLTO and CFI are
- * both enabled, i.e. foo() becomes foo$707af9a22804d33c81801f27dcfe489b.
- * This causes confusion and potentially breaks user space tools, so we
- * strip the suffix from expanded symbol names.
- */
-static inline bool cleanup_symbol_name(char *s)
+static bool cleanup_symbol_name(char *s)
 {
        char *res;
 
+       if (!IS_ENABLED(CONFIG_LTO_CLANG))
+               return false;
+
+       /*
+        * LLVM appends various suffixes for local functions and variables that
+        * must be promoted to global scope as part of LTO.  This can break
+        * hooking of static functions with kprobes. '.' is not a valid
+        * character in an identifier in C. Suffixes observed:
+        * - foo.llvm.[0-9a-f]+
+        * - foo.[0-9a-f]+
+        * - foo.[0-9a-f]+.cfi_jt
+        */
+       res = strchr(s, '.');
+       if (res) {
+               *res = '\0';
+               return true;
+       }
+
+       if (!IS_ENABLED(CONFIG_CFI_CLANG) ||
+           !IS_ENABLED(CONFIG_LTO_CLANG_THIN) ||
+           CONFIG_CLANG_VERSION >= 130000)
+               return false;
+
+       /*
+        * Prior to LLVM 13, the following suffixes were observed when thinLTO
+        * and CFI are both enabled:
+        * - foo$[0-9]+
+        */
        res = strrchr(s, '$');
-       if (res)
+       if (res) {
                *res = '\0';
+               return true;
+       }
 
-       return res != NULL;
+       return false;
 }
-#else
-static inline bool cleanup_symbol_name(char *s) { return false; }
-#endif
 
 /* Lookup the address for this symbol. Returns 0 if not found. */
 unsigned long kallsyms_lookup_name(const char *name)