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 Bug: 133186739 Change-Id: Ieb8bf20d0c3ad7b7295c535f598370220598cdb0 Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
This commit is contained in:
committed by
Alistair Strachan
parent
b4a47b3387
commit
fb0e5d877b
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user