linux-toolchains.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] linkage: Fix issue with missing symbol size
@ 2022-04-29  9:18 Peter Zijlstra
  2022-04-29 20:12 ` Josh Poimboeuf
  2022-05-03 14:30 ` Mark Rutland
  0 siblings, 2 replies; 4+ messages in thread
From: Peter Zijlstra @ 2022-04-29  9:18 UTC (permalink / raw)
  To: x86, jpoimboe, mark.rutland; +Cc: linux-kernel, peterz, linux-toolchains


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: e0891269a8c2 ("linkage: add SYM_FUNC_ALIAS{,_LOCAL,_WEAK}()")
Suggested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 include/linux/linkage.h |   15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

--- a/include/linux/linkage.h
+++ b/include/linux/linkage.h
@@ -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 === */
@@ -261,7 +258,7 @@
  */
 #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
 
 /*
@@ -269,7 +266,7 @@
  */
 #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
 
 /*
@@ -277,7 +274,7 @@
  */
 #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 */


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] linkage: Fix issue with missing symbol size
  2022-04-29  9:18 [PATCH] linkage: Fix issue with missing symbol size Peter Zijlstra
@ 2022-04-29 20:12 ` Josh Poimboeuf
  2022-04-29 21:06   ` Fāng-ruì Sòng
  2022-05-03 14:30 ` Mark Rutland
  1 sibling, 1 reply; 4+ messages in thread
From: Josh Poimboeuf @ 2022-04-29 20:12 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: x86, mark.rutland, linux-kernel, linux-toolchains

On Fri, Apr 29, 2022 at 11:18:59AM +0200, Peter Zijlstra wrote:
> 
> 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: e0891269a8c2 ("linkage: add SYM_FUNC_ALIAS{,_LOCAL,_WEAK}()")
> Suggested-by: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>

-- 
Josh


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] linkage: Fix issue with missing symbol size
  2022-04-29 20:12 ` Josh Poimboeuf
@ 2022-04-29 21:06   ` Fāng-ruì Sòng
  0 siblings, 0 replies; 4+ messages in thread
From: Fāng-ruì Sòng @ 2022-04-29 21:06 UTC (permalink / raw)
  To: Josh Poimboeuf
  Cc: Peter Zijlstra, x86, mark.rutland, linux-kernel, linux-toolchains

On Fri, Apr 29, 2022 at 1:13 PM Josh Poimboeuf <jpoimboe@redhat.com> wrote:
>
> On Fri, Apr 29, 2022 at 11:18:59AM +0200, Peter Zijlstra wrote:
> >
> > 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: e0891269a8c2 ("linkage: add SYM_FUNC_ALIAS{,_LOCAL,_WEAK}()")
> > Suggested-by: Mark Rutland <mark.rutland@arm.com>
> > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
>
> Acked-by: Josh Poimboeuf <jpoimboe@redhat.com>
>
> --
> Josh
>

Yeah, an alias inherits the original symbol's st_size.
In case you are interested in the internals, see
https://sourceware.org/bugzilla/show_bug.cgi?id=29012 ("gas: .set
should copy st_size only if src's st_size is unset")

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] linkage: Fix issue with missing symbol size
  2022-04-29  9:18 [PATCH] linkage: Fix issue with missing symbol size Peter Zijlstra
  2022-04-29 20:12 ` Josh Poimboeuf
@ 2022-05-03 14:30 ` Mark Rutland
  1 sibling, 0 replies; 4+ messages in thread
From: Mark Rutland @ 2022-05-03 14:30 UTC (permalink / raw)
  To: Peter Zijlstra; +Cc: x86, jpoimboe, linux-kernel, linux-toolchains

On Fri, Apr 29, 2022 at 11:18:59AM +0200, Peter Zijlstra wrote:
> 
> 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: e0891269a8c2 ("linkage: add SYM_FUNC_ALIAS{,_LOCAL,_WEAK}()")
> Suggested-by: Mark Rutland <mark.rutland@arm.com>
> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

Sorry about this!

FWIW:

Reviewed-by: Mark Rutland <mark.rutland@arm.com>

Thanks,
Mark.

> ---
>  include/linux/linkage.h |   15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
> 
> --- a/include/linux/linkage.h
> +++ b/include/linux/linkage.h
> @@ -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 === */
> @@ -261,7 +258,7 @@
>   */
>  #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
>  
>  /*
> @@ -269,7 +266,7 @@
>   */
>  #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
>  
>  /*
> @@ -277,7 +274,7 @@
>   */
>  #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 */
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-05-03 14:30 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-29  9:18 [PATCH] linkage: Fix issue with missing symbol size Peter Zijlstra
2022-04-29 20:12 ` Josh Poimboeuf
2022-04-29 21:06   ` Fāng-ruì Sòng
2022-05-03 14:30 ` Mark Rutland

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).