Linux 中的 System.map简介

news/2024/11/28 9:47:42/

源码基于:Linux 5.4

0. 前言

对于计算机而言是没有符号这个概念的,只有0 和 1,但是我们比较容易理解的是函数名、变量名这样的符号。在Linux 内核中用 System.map 来记录Linux 内核中的符号信息,称为内核的符号表,该文件会在每次内核编译的时候,都会产生一个新的对应的 System.map 文件。在内核运行出错时,通过 System.map 中的符号表解析,就可以查到一个地址值对应的变量名、函数名。

在Android 系统中,内核的符号表通过两个文件查看:

  • out/target/product/shift/obj/kernel/shift-5.4/System.map 编译产生;
  • 平台中 /proc/kallsyms 动态加载内核模块的符号;

1. System.map 文件的内容

0000000000000000 A __rela_size
0000000000000000 A _kernel_flags_le_hi32
0000000000000000 A _kernel_offset_le_hi32
...
0000000003ca6000 A _kernel_size_le_lo32ffffffc010080000 t $x
ffffffc010080000 t __efistub__text
ffffffc010080000 t _head
ffffffc010080000 T _text                 //-----从ffffffc010080000,即 _text 进入代码段
ffffffc010080040 t pe_header
ffffffc010080044 t coff_header
...
ffffffc010081000 t $x.1778
ffffffc010081000 T __exception_text_start
ffffffc010081000 T _stext                //-----从ffffffc010081000,代码段中的 _stext函数
ffffffc010081000 t efi_header_end
ffffffc010081000 t sun4i_handle_irq
...
ffffffc011380000 D __entry_tramp_data_start
ffffffc011380000 d __entry_tramp_data_vectors
ffffffc011380000 D __start_rodata
ffffffc011380000 T _etext               //-----从ffffffc011380000,退出代码段
ffffffc011380008 d __entry_tramp_data_this_cpu_vector    //----进入初始化数据段
ffffffc011381000 D vdso_start
ffffffc011382000 D vdso32_start
ffffffc011382000 D vdso_end
ffffffc011383000 D vdso32_end
...
ffffffc0120beb88 r __pci_fixup_qcom_fixup_class1536     //----进入常量数据段
ffffffc0120beb88 R __start_pci_fixups_early
ffffffc0120beba0 r __pci_fixup_qcom_fixup_class1537
...ffffffc0127a3200 D __bss_start          //----内核初始化数据结束,之后为未初始化数据
ffffffc0127a3200 d __efistub__edata
ffffffc0127a3200 D _edata               //----内核初始化数据结束,之后为未初始化数据
...ffffffc013d26000 b __efistub__end
ffffffc013d26000 B _end                 //----内核未初始化数据结束
ffffffc013d26000 B init_pg_end

System.map 文件是通过 nm vmlinux 命令重定向到文件中产生的。

2. kallsyms 文件的内容

对于 /proc/kallsyms 内容摘录如下:

130|shift:/ # cat /proc/kallsyms
0000000000000000 t _head
0000000000000000 T _text
0000000000000000 t pe_header
0000000000000000 t coff_header
0000000000000000 t optional_header
0000000000000000 t extra_header_fields
0000000000000000 t section_table
0000000000000000 t efi_header_end
0000000000000000 t sun4i_handle_irq
0000000000000000 T _stext
0000000000000000 T __exception_text_start
0000000000000000 t gic_handle_irq
0000000000000000 T do_undefinstr
0000000000000000 T do_cp15instr
0000000000000000 T do_sysinstr
0000000000000000 T do_mem_abort
0000000000000000 T do_el0_irq_bp_hardening
0000000000000000 T do_el0_ia_bp_hardening
0000000000000000 T do_sp_pc_abort
0000000000000000 T do_debug_exception

kallsyms 文件包含了动态加载的内核模块的符号,抽取了内核用到的所有函数地址和非数据变量地址,生成了一个数据块,作为只读数据链接进 kernel image。

3. 两个文件区别

区别1:

  • /proc/kallsysms 具有动态加载模块的符号以及静态代码(kernel image)的符号表;
  • system.map 仅是静态代码(kernel image)的符号表;

正在运行的内核可能和System.map不匹配,所以/proc/kallsyms才是内核符号参考的主要来源,我们应该通过/proc/kallsyms获得符号的地址。

区别2:

  • System.map 是文件系统上的实际文件。 每次内核编译都会生成一个新的 System.map;
  • /proc/kallsyms 是内核启动时动态创建的“proc 文件”。 实际上,它并不是真正的磁盘文件。 它是内核数据的表示,已经加载到内存中。因此,对于当前正在运行的内核,它总是正确的;

4. 符号表内容

内容分三个部分:

  • 符号地址;
  • 符号类型;
  • 符号名;

4.1 符号类型

如果是小写,符号通常是局部的; 如果是大写,则符号是全局的(外部的)

typecomment
AThe symbol’s value is absolute, and will not be changed by further linking.
B/bThe symbol is in the BSS data section. This section typically contains zero-initialized or uninitialized data, although the exact behavior is system dependent.
CThe symbol is common. Common symbols are uninitialized data. When linking, multiple common symbols may appear with the same name. If the symbol is defined anywhere, the common symbols are treated as undefined references.
D/dThe symbol is in the initialized data section.
G/gThe symbol is in an initialized data section for small objects. Some object file formats permit more efficient access to small data objects, such as a global int variable as opposed to a large global array.
iFor ELF format files this indicates that the symbol is an indirect function. This is a GNU extension to the standard set of ELF symbol types. It indicates a symbol which if referenced by a relocation does not evaluate to its address, but instead must be invoked at runtime. The runtime execution will then return the value to be used in the relocation.
IThe symbol is an indirect reference to another symbol.
NThe symbol is a debugging symbol
pThe symbols is in a stack unwind section
R/rThe symbol is in a read only data section
S/sThe symbol is in an uninitialized or zero-initialized data section for small objects.
T/tThe symbol is in the text (code) section.
UThe symbol is undefined.
uThe symbol is a unique global symbol. This is a GNU extension to the standard set of ELF symbol bindings. For such a symbol the dynamic linker will make sure that in the entire process there is just one symbol with this name and type in use.

V/v

The symbol is a weak object. When a weak defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the weak symbol becomes zero with no error. On some systems, uppercase indicates that a default value has been specified.
W/wThe symbol is a weak symbol that has not been specifically tagged as a weak object symbol. When a weak defined symbol is linked with a normal defined symbol, the normal defined symbol is used with no error. When a weak undefined symbol is linked and the symbol is not defined, the value of the symbol is determined in a system-specific manner without error. On some systems, uppercase indicates that a default value has been specified.
-The symbol is a stabs symbol in an a.out object file. In this case, the next values printed are the stabs other field, the stabs desc field, and the stab type. Stabs symbols are used to hold debugging information.
?The symbol type is unknown, or object file format specific.


http://www.ppmy.cn/news/41792.html

相关文章

【华为OD机试真题】Excel单元格数值统计(javapython)

Excel单元格数值统计 知识点递归循环数组Q时间限制:2s空间限制:256MB限定语言:不限 题目描述: Excel工作表中对选定区域的数值进行统计的功能非常实用。仿照Excel的这个功能,请对给定表格中选中区域中的单元格进行求和统计,并输出 统计结果。 为简化计算,假设当前输入…

蓝桥杯第26天(Python)考前挣扎

题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…

1365. 有多少小于当前数字的数字

1365. 有多少小于当前数字的数字 难度简单250 给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。 换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j ! i 且 nums[j] &…

Ae:灯光图层

灯光 Light是合成中可用于照亮其他 3D 图层并能产生投影、反射的一种元素,类似于光源。如果没有建立灯光图层,系统会使用默认的“环境光”来照亮场景。当建立了灯光图层之后,以所建立的灯光来照明。一般可根据实际需要创建一个或多个相同或不…

OA系统是什么意思?企业为什么要用OA办公系统软件?

阅读本文您将了解:1、什么是OA;2、OA系统是什么意思;2、OA系统功能和对企业重要性 什么是OA? OA即办公自动化(Office Automation,简称OA),是将计算机、通信等现代化技术运用到传统…

Java动态代理

一. 什么是动态代理 假设Student里面有一个吃饭的eat方法,那么现在我要给这个方法去增加其他的功能,比如说吃饭之前,要去拿筷子,要去盛饭,按照以前所学,我们只能把这两段代码都写在eat方法当中,…

golang指针相关

指针相关的部分实在是没有搞太明白,抽时间来总结下。 1.指针相关基础知识 比如现在有一句话:『谜底666』,这句话在程序中一启动,就要加载到内存中,假如内存地址0x123456,然后我们可以将这句话复制给变量A&…

CentOS Ubuntu Debian三个linux的异同对比

Linux有非常多的发行版本,从性质上划分,大体分为由商业公司维护的商业版本与由开源社区维护的免费发行版本。 商业版本以Redhat为代表,开源社区版本则以debian为代表。这些版本各有不同的特点,在不同的应用领域发挥着不同的作用&…