module: Ignore L0 and rename is_arm_mapping_symbol()
The L0 symbol is generated when build module on LoongArch, ignore it in
modpost and when looking at module symbols, otherwise we can not see the
expected call trace.
Now is_arm_mapping_symbol() is not only for ARM, in order to reflect the
reality, rename is_arm_mapping_symbol() to is_mapping_symbol().
This is related with commit c17a253870
("mksysmap: Fix the mismatch of
'L0' symbols in System.map").
(1) Simple test case
[loongson@linux hello]$ cat hello.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
static void test_func(void)
{
pr_info("This is a test\n");
dump_stack();
}
static int __init hello_init(void)
{
pr_warn("Hello, world\n");
test_func();
return 0;
}
static void __exit hello_exit(void)
{
pr_warn("Goodbye\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
[loongson@linux hello]$ cat Makefile
obj-m:=hello.o
ccflags-y += -g -Og
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
(2) Test environment
system: LoongArch CLFS 5.5
https://github.com/sunhaiyong1978/CLFS-for-LoongArch/releases/tag/5.0
It needs to update grub to avoid booting error "invalid magic number".
kernel: 6.3-rc1 with loongson3_defconfig + CONFIG_DYNAMIC_FTRACE=y
(3) Test result
Without this patch:
[root@linux hello]# insmod hello.ko
[root@linux hello]# dmesg
...
Hello, world
This is a test
...
Call Trace:
[<9000000000223728>] show_stack+0x68/0x18c
[<90000000013374cc>] dump_stack_lvl+0x60/0x88
[<ffff800002050028>] L0\x01+0x20/0x2c [hello]
[<ffff800002058028>] L0\x01+0x20/0x30 [hello]
[<900000000022097c>] do_one_initcall+0x88/0x288
[<90000000002df890>] do_init_module+0x54/0x200
[<90000000002e1e18>] __do_sys_finit_module+0xc4/0x114
[<90000000013382e8>] do_syscall+0x7c/0x94
[<9000000000221e3c>] handle_syscall+0xbc/0x158
With this patch:
[root@linux hello]# insmod hello.ko
[root@linux hello]# dmesg
...
Hello, world
This is a test
...
Call Trace:
[<9000000000223728>] show_stack+0x68/0x18c
[<90000000013374cc>] dump_stack_lvl+0x60/0x88
[<ffff800002050028>] test_func+0x28/0x34 [hello]
[<ffff800002058028>] hello_init+0x28/0x38 [hello]
[<900000000022097c>] do_one_initcall+0x88/0x288
[<90000000002df890>] do_init_module+0x54/0x200
[<90000000002e1e18>] __do_sys_finit_module+0xc4/0x114
[<90000000013382e8>] do_syscall+0x7c/0x94
[<9000000000221e3c>] handle_syscall+0xbc/0x158
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
Tested-by: Youling Tang <tangyouling@loongson.cn> # for LoongArch
Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
This commit is contained in:
parent
987d2e0aaa
commit
0a3bf86092
@ -3,10 +3,12 @@
|
|||||||
#define _LINUX_MODULE_SYMBOL_H
|
#define _LINUX_MODULE_SYMBOL_H
|
||||||
|
|
||||||
/* This ignores the intensely annoying "mapping symbols" found in ELF files. */
|
/* This ignores the intensely annoying "mapping symbols" found in ELF files. */
|
||||||
static inline int is_arm_mapping_symbol(const char *str)
|
static inline int is_mapping_symbol(const char *str)
|
||||||
{
|
{
|
||||||
if (str[0] == '.' && str[1] == 'L')
|
if (str[0] == '.' && str[1] == 'L')
|
||||||
return true;
|
return true;
|
||||||
|
if (str[0] == 'L' && str[1] == '0')
|
||||||
|
return true;
|
||||||
return str[0] == '$' &&
|
return str[0] == '$' &&
|
||||||
(str[1] == 'a' || str[1] == 'd' || str[1] == 't' || str[1] == 'x')
|
(str[1] == 'a' || str[1] == 'd' || str[1] == 't' || str[1] == 'x')
|
||||||
&& (str[2] == '\0' || str[2] == '.');
|
&& (str[2] == '\0' || str[2] == '.');
|
||||||
|
@ -289,7 +289,7 @@ static const char *find_kallsyms_symbol(struct module *mod,
|
|||||||
* and inserted at a whim.
|
* and inserted at a whim.
|
||||||
*/
|
*/
|
||||||
if (*kallsyms_symbol_name(kallsyms, i) == '\0' ||
|
if (*kallsyms_symbol_name(kallsyms, i) == '\0' ||
|
||||||
is_arm_mapping_symbol(kallsyms_symbol_name(kallsyms, i)))
|
is_mapping_symbol(kallsyms_symbol_name(kallsyms, i)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (thisval <= addr && thisval > bestval) {
|
if (thisval <= addr && thisval > bestval) {
|
||||||
|
@ -1115,7 +1115,7 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If there's no name there, ignore it; likewise, ignore it if it's
|
* If there's no name there, ignore it; likewise, ignore it if it's
|
||||||
* one of the magic symbols emitted used by current ARM tools.
|
* one of the magic symbols emitted used by current tools.
|
||||||
*
|
*
|
||||||
* Otherwise if find_symbols_between() returns those symbols, they'll
|
* Otherwise if find_symbols_between() returns those symbols, they'll
|
||||||
* fail the whitelist tests and cause lots of false alarms ... fixable
|
* fail the whitelist tests and cause lots of false alarms ... fixable
|
||||||
@ -1128,7 +1128,7 @@ static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
|
|||||||
|
|
||||||
if (!name || !strlen(name))
|
if (!name || !strlen(name))
|
||||||
return 0;
|
return 0;
|
||||||
return !is_arm_mapping_symbol(name);
|
return !is_mapping_symbol(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user