From 86720406ae312d7e540c4ae7e687cd00433cfa9f Mon Sep 17 00:00:00 2001 From: Sami Tolvanen Date: Thu, 4 Oct 2018 08:56:16 -0700 Subject: [PATCH] ANDROID: modpost: add an exception for CFI stubs 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 --- scripts/mod/modpost.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index c22041a4fc36..30e0aa4665ca 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -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; } -- 2.20.1