Skip to content

Commit

Permalink
linkage: Fix issue with missing symbol size
Browse files Browse the repository at this point in the history
[ Upstream commit 3ff5f78 ]

Occasionally, typically when a function doesn't end with 'ret', an
alias on that function will have 0 size.

The difference between what GCC generates and our linkage magic, is
that GCC doesn't appear to provide .size for the alias'ed symbol at
all. And indeed, removing this directive cures the issue.

Additionally, GCC also doesn't emit .type for alias symbols either, so
also omit that.

Fixes: e089126 ("linkage: add SYM_FUNC_ALIAS{,_LOCAL,_WEAK}()")
Suggested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lore.kernel.org/r/20220506121631.437480085@infradead.org
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Peter Zijlstra authored and gregkh committed Jun 9, 2022
1 parent da03bbf commit d4c824f
Showing 1 changed file with 6 additions and 9 deletions.
15 changes: 6 additions & 9 deletions include/linux/linkage.h
Expand Up @@ -171,12 +171,9 @@

/* SYM_ALIAS -- use only if you have to */
#ifndef SYM_ALIAS
#define SYM_ALIAS(alias, name, sym_type, linkage) \
linkage(alias) ASM_NL \
.set alias, name ASM_NL \
.type alias sym_type ASM_NL \
.set .L__sym_size_##alias, .L__sym_size_##name ASM_NL \
.size alias, .L__sym_size_##alias
#define SYM_ALIAS(alias, name, linkage) \
linkage(alias) ASM_NL \
.set alias, name ASM_NL
#endif

/* === code annotations === */
Expand Down Expand Up @@ -261,23 +258,23 @@
*/
#ifndef SYM_FUNC_ALIAS
#define SYM_FUNC_ALIAS(alias, name) \
SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_GLOBAL)
SYM_ALIAS(alias, name, SYM_L_GLOBAL)
#endif

/*
* SYM_FUNC_ALIAS_LOCAL -- define a local alias for an existing function
*/
#ifndef SYM_FUNC_ALIAS_LOCAL
#define SYM_FUNC_ALIAS_LOCAL(alias, name) \
SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_LOCAL)
SYM_ALIAS(alias, name, SYM_L_LOCAL)
#endif

/*
* SYM_FUNC_ALIAS_WEAK -- define a weak global alias for an existing function
*/
#ifndef SYM_FUNC_ALIAS_WEAK
#define SYM_FUNC_ALIAS_WEAK(alias, name) \
SYM_ALIAS(alias, name, SYM_T_FUNC, SYM_L_WEAK)
SYM_ALIAS(alias, name, SYM_L_WEAK)
#endif

/* SYM_CODE_START -- use for non-C (special) functions */
Expand Down

0 comments on commit d4c824f

Please sign in to comment.