Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f0685ef authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Alistair Strachan
Browse files

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: default avatarSami Tolvanen <samitolvanen@google.com>
parent ea853e03
Loading
Loading
Loading
Loading
+17 −0
Original line number Original line Diff line number Diff line
@@ -945,6 +945,7 @@ static const char *const head_sections[] = { ".head.text*", NULL };
static const char *const linker_symbols[] =
static const char *const linker_symbols[] =
	{ "__init_begin", "_sinittext", "_einittext", NULL };
	{ "__init_begin", "_sinittext", "_einittext", NULL };
static const char *const optim_symbols[] = { "*.constprop.*", NULL };
static const char *const optim_symbols[] = { "*.constprop.*", NULL };
static const char *const cfi_symbols[] = { "*.cfi", NULL };


enum mismatch {
enum mismatch {
	TEXT_TO_ANY_INIT,
	TEXT_TO_ANY_INIT,
@@ -1166,6 +1167,16 @@ static const struct sectioncheck *section_mismatch(
 *   fromsec = text section
 *   fromsec = text section
 *   refsymname = *.constprop.*
 *   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,
static int secref_whitelist(const struct sectioncheck *mismatch,
			    const char *fromsec, const char *fromsym,
			    const char *fromsec, const char *fromsym,
@@ -1204,6 +1215,12 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
	    match(fromsym, optim_symbols))
	    match(fromsym, optim_symbols))
		return 0;
		return 0;


	/* Check for pattern 6 */
	if (match(fromsec, text_sections) &&
	    match(tosec, init_exit_sections) &&
	    match(tosym, cfi_symbols))
		return 0;

	return 1;
	return 1;
}
}