diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index ca5bb33d7460..b16c893e377c 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -945,6 +945,7 @@ static const char *const head_sections[] = { ".head.text*", NULL }; static const char *const linker_symbols[] = { "__init_begin", "_sinittext", "_einittext", NULL }; static const char *const optim_symbols[] = { "*.constprop.*", NULL }; +static const char *const cfi_symbols[] = { "*.cfi", NULL }; enum mismatch { TEXT_TO_ANY_INIT, @@ -1166,6 +1167,16 @@ static const struct sectioncheck *section_mismatch( * fromsec = text section * refsymname = *.constprop.* * + * Pattern 6: + * With CONFIG_CFI_CLANG, clang appends .cfi to all indirectly called + * functions and creates a function stub with the original name. This + * stub is always placed in .text, even if the actual function with the + * .cfi postfix is in .init.text or .exit.text. + * This pattern is identified by + * tosec = init or exit section + * fromsec = text section + * tosym = *.cfi + * **/ static int secref_whitelist(const struct sectioncheck *mismatch, const char *fromsec, const char *fromsym, @@ -1204,6 +1215,12 @@ static int secref_whitelist(const struct sectioncheck *mismatch, match(fromsym, optim_symbols)) return 0; + /* Check for pattern 6 */ + if (match(fromsec, text_sections) && + match(tosec, init_exit_sections) && + match(tosym, cfi_symbols)) + return 0; + return 1; }