ANDROID: modpost: add an exception for CFI stubs
authorSami Tolvanen <samitolvanen@google.com>
Thu, 4 Oct 2018 15:56:16 +0000 (08:56 -0700)
committerStricted <info@stricted.net>
Sun, 3 May 2020 04:36:24 +0000 (04:36 +0000)
When CONFIG_CFI_CLANG is enabled, LLVM renames all address taken
functions by appending a .cfi postfix to their names, and creates
function stubs with the original names. The compiler always injects
these stubs to the text section, even if the function itself is
placed into init or exit sections, which creates modpost warnings.
This commit adds a modpost exception for CFI stubs to prevent the
warnings.

Bug: 117237524
Change-Id: Ieb8bf20d0c3ad7b7295c535f598370220598cdb0
Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
scripts/mod/modpost.c

index c22041a4fc360ec2d4cc6faf206faa03da6fa5bb..30e0aa4665ca3e82eff4332c854473a4e3817501 100644 (file)
@@ -953,6 +953,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,
@@ -1174,6 +1175,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,
@@ -1212,6 +1223,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;
 }