All of lore.kernel.org
 help / color / mirror / Atom feed
From: Randy Dunlap <rdunlap@infradead.org>
To: Palmer Dabbelt <palmer@rivosinc.com>, mcgrof@kernel.org
Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] module: Ignore RISC-V mapping symbols too
Date: Fri, 7 Jul 2023 08:08:12 -0700	[thread overview]
Message-ID: <437ac153-620c-2012-7ce3-66442b505972@infradead.org> (raw)
In-Reply-To: <20230707054007.32591-1-palmer@rivosinc.com>



On 7/6/23 22:40, Palmer Dabbelt wrote:
> RISC-V has an extended form of mapping symbols that we use to encode
> the ISA when it changes in the middle of an ELF.  This trips up modpost
> as a build failure, I haven't yet verified it yet but I believe the
> kallsyms difference should result in stacks looking sane again.
> 
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Link: https://lore.kernel.org/all/9d9e2902-5489-4bf0-d9cb-556c8e5d71c2@infradead.org/
> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>


Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
Tested-by: Randy Dunlap <rdunlap@infradead.org> # build-tested

Thanks.

> ---
> I'm not sure about a fixes here, the breakage comes from a binutils change
> that's pretty much independent from the kernel.
> 
> Plumbing in through the RISC-V-specific switch is also a bit ugly, but I'm not
> sure just dropping everyone's "$"-prefixed symbols is a good idea -- the rest
> of this is sort of half-way arch-specific, though, so maybe that's the way to
> go?  I figure it's easier to delete stuff than add it, though.
> ---
>  include/linux/module_symbol.h | 12 +++++++++++-
>  kernel/module/kallsyms.c      |  8 +++++++-
>  scripts/mod/modpost.c         |  2 +-
>  3 files changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/module_symbol.h b/include/linux/module_symbol.h
> index 7ace7ba30203..5b799942b243 100644
> --- a/include/linux/module_symbol.h
> +++ b/include/linux/module_symbol.h
> @@ -3,12 +3,22 @@
>  #define _LINUX_MODULE_SYMBOL_H
>  
>  /* This ignores the intensely annoying "mapping symbols" found in ELF files. */
> -static inline int is_mapping_symbol(const char *str)
> +static inline int is_mapping_symbol(const char *str, int is_riscv)
>  {
>  	if (str[0] == '.' && str[1] == 'L')
>  		return true;
>  	if (str[0] == 'L' && str[1] == '0')
>  		return true;
> +	/*
> +	 * RISC-V defines various special symbols that start with "$".  The
> +	 * mapping symbols, which exist to differentiate between incompatible
> +	 * instruction encodings when disassembling, show up all over the place
> +	 * and are generally not meant to be treated like other symbols.  So
> +	 * just ignore any of the special symbols.
> +	 */
> +	if (is_riscv)
> +		return str[0] == '$';
> +
>  	return str[0] == '$' &&
>  	       (str[1] == 'a' || str[1] == 'd' || str[1] == 't' || str[1] == 'x')
>  	       && (str[2] == '\0' || str[2] == '.');
> diff --git a/kernel/module/kallsyms.c b/kernel/module/kallsyms.c
> index ef73ae7c8909..1e988e542c5d 100644
> --- a/kernel/module/kallsyms.c
> +++ b/kernel/module/kallsyms.c
> @@ -12,6 +12,12 @@
>  #include <linux/bsearch.h>
>  #include "internal.h"
>  
> +#ifdef CONFIG_RISCV
> +#define IS_RISCV 1
> +#else
> +#define IS_RISCV 0
> +#endif
> +
>  /* Lookup exported symbol in given range of kernel_symbols */
>  static const struct kernel_symbol *lookup_exported_symbol(const char *name,
>  							  const struct kernel_symbol *start,
> @@ -289,7 +295,7 @@ static const char *find_kallsyms_symbol(struct module *mod,
>  		 * and inserted at a whim.
>  		 */
>  		if (*kallsyms_symbol_name(kallsyms, i) == '\0' ||
> -		    is_mapping_symbol(kallsyms_symbol_name(kallsyms, i)))
> +		    is_mapping_symbol(kallsyms_symbol_name(kallsyms, i), IS_RISCV))
>  			continue;
>  
>  		if (thisval <= addr && thisval > bestval) {
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index b29b29707f10..7c71429d6502 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -1052,7 +1052,7 @@ static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
>  
>  	if (!name || !strlen(name))
>  		return 0;
> -	return !is_mapping_symbol(name);
> +	return !is_mapping_symbol(name, elf->hdr->e_machine == EM_RISCV);
>  }
>  
>  /* Look up the nearest symbol based on the section and the address */

-- 
~Randy

WARNING: multiple messages have this Message-ID (diff)
From: Randy Dunlap <rdunlap@infradead.org>
To: Palmer Dabbelt <palmer@rivosinc.com>, mcgrof@kernel.org
Cc: linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] module: Ignore RISC-V mapping symbols too
Date: Fri, 7 Jul 2023 08:08:12 -0700	[thread overview]
Message-ID: <437ac153-620c-2012-7ce3-66442b505972@infradead.org> (raw)
In-Reply-To: <20230707054007.32591-1-palmer@rivosinc.com>



On 7/6/23 22:40, Palmer Dabbelt wrote:
> RISC-V has an extended form of mapping symbols that we use to encode
> the ISA when it changes in the middle of an ELF.  This trips up modpost
> as a build failure, I haven't yet verified it yet but I believe the
> kallsyms difference should result in stacks looking sane again.
> 
> Reported-by: Randy Dunlap <rdunlap@infradead.org>
> Link: https://lore.kernel.org/all/9d9e2902-5489-4bf0-d9cb-556c8e5d71c2@infradead.org/
> Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>


Reviewed-by: Randy Dunlap <rdunlap@infradead.org>
Tested-by: Randy Dunlap <rdunlap@infradead.org> # build-tested

Thanks.

> ---
> I'm not sure about a fixes here, the breakage comes from a binutils change
> that's pretty much independent from the kernel.
> 
> Plumbing in through the RISC-V-specific switch is also a bit ugly, but I'm not
> sure just dropping everyone's "$"-prefixed symbols is a good idea -- the rest
> of this is sort of half-way arch-specific, though, so maybe that's the way to
> go?  I figure it's easier to delete stuff than add it, though.
> ---
>  include/linux/module_symbol.h | 12 +++++++++++-
>  kernel/module/kallsyms.c      |  8 +++++++-
>  scripts/mod/modpost.c         |  2 +-
>  3 files changed, 19 insertions(+), 3 deletions(-)
> 
> diff --git a/include/linux/module_symbol.h b/include/linux/module_symbol.h
> index 7ace7ba30203..5b799942b243 100644
> --- a/include/linux/module_symbol.h
> +++ b/include/linux/module_symbol.h
> @@ -3,12 +3,22 @@
>  #define _LINUX_MODULE_SYMBOL_H
>  
>  /* This ignores the intensely annoying "mapping symbols" found in ELF files. */
> -static inline int is_mapping_symbol(const char *str)
> +static inline int is_mapping_symbol(const char *str, int is_riscv)
>  {
>  	if (str[0] == '.' && str[1] == 'L')
>  		return true;
>  	if (str[0] == 'L' && str[1] == '0')
>  		return true;
> +	/*
> +	 * RISC-V defines various special symbols that start with "$".  The
> +	 * mapping symbols, which exist to differentiate between incompatible
> +	 * instruction encodings when disassembling, show up all over the place
> +	 * and are generally not meant to be treated like other symbols.  So
> +	 * just ignore any of the special symbols.
> +	 */
> +	if (is_riscv)
> +		return str[0] == '$';
> +
>  	return str[0] == '$' &&
>  	       (str[1] == 'a' || str[1] == 'd' || str[1] == 't' || str[1] == 'x')
>  	       && (str[2] == '\0' || str[2] == '.');
> diff --git a/kernel/module/kallsyms.c b/kernel/module/kallsyms.c
> index ef73ae7c8909..1e988e542c5d 100644
> --- a/kernel/module/kallsyms.c
> +++ b/kernel/module/kallsyms.c
> @@ -12,6 +12,12 @@
>  #include <linux/bsearch.h>
>  #include "internal.h"
>  
> +#ifdef CONFIG_RISCV
> +#define IS_RISCV 1
> +#else
> +#define IS_RISCV 0
> +#endif
> +
>  /* Lookup exported symbol in given range of kernel_symbols */
>  static const struct kernel_symbol *lookup_exported_symbol(const char *name,
>  							  const struct kernel_symbol *start,
> @@ -289,7 +295,7 @@ static const char *find_kallsyms_symbol(struct module *mod,
>  		 * and inserted at a whim.
>  		 */
>  		if (*kallsyms_symbol_name(kallsyms, i) == '\0' ||
> -		    is_mapping_symbol(kallsyms_symbol_name(kallsyms, i)))
> +		    is_mapping_symbol(kallsyms_symbol_name(kallsyms, i), IS_RISCV))
>  			continue;
>  
>  		if (thisval <= addr && thisval > bestval) {
> diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
> index b29b29707f10..7c71429d6502 100644
> --- a/scripts/mod/modpost.c
> +++ b/scripts/mod/modpost.c
> @@ -1052,7 +1052,7 @@ static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
>  
>  	if (!name || !strlen(name))
>  		return 0;
> -	return !is_mapping_symbol(name);
> +	return !is_mapping_symbol(name, elf->hdr->e_machine == EM_RISCV);
>  }
>  
>  /* Look up the nearest symbol based on the section and the address */

-- 
~Randy

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

  parent reply	other threads:[~2023-07-07 15:08 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-07  5:40 [PATCH] module: Ignore RISC-V mapping symbols too Palmer Dabbelt
2023-07-07  5:40 ` Palmer Dabbelt
2023-07-07  6:06 ` Thomas Weißschuh
2023-07-07  6:06   ` Thomas Weißschuh
2023-07-07 16:03   ` Palmer Dabbelt
2023-07-07 16:03     ` Palmer Dabbelt
2023-07-07 15:08 ` Randy Dunlap [this message]
2023-07-07 15:08   ` Randy Dunlap

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=437ac153-620c-2012-7ce3-66442b505972@infradead.org \
    --to=rdunlap@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=mcgrof@kernel.org \
    --cc=palmer@rivosinc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.