system.map
包含kernel image
的符号表。/proc/kallsyms
则包含kernel image
和所有动态加载模块的符号表。如果一个函数被编译器内联(inline
)或者优化掉了,则它在/proc/kallsyms
有可能找不到。
此外,如果不是root
用户,则显示/proc/kallsyms
中的地址都是0
:
$ cat /proc/kallsyms | more
0000000000000000 A irq_stack_union
0000000000000000 A __per_cpu_start
0000000000000000 A cpu_debug_store
0000000000000000 A cpu_tss_rw
......
$ sudo cat /proc/kallsyms | more
[sudo] password for xiaonan:
0000000000000000 A irq_stack_union
0000000000000000 A __per_cpu_start
0000000000004000 A cpu_debug_store
0000000000005000 A cpu_tss_rw
0000000000008000 A gdt_page
0000000000009000 A exception_stacks
......
看起来kallsyms_lookup_name
需要CONFIG_KALLSYMS_ALL
设置为Y
(参考CONFIG_KALLSYMS_ALL)。
Module.symvers
包含了kernel
所有export
的symbols
(参考What is the purpose of “Module.symvers” in Linux?)。这个链接讲了/proc/kallsyms
,可以和Module.symvers
对比。
参考资料:
Reading kallsyms in user-mode ;
Does kallsyms have all the symbol of kernel functions?;
System.map file and /proc/kallsyms;
system.map。