> 文章列表 > Linux System.map解析

Linux System.map解析

Linux System.map解析

Linux System.map解析

  • 1. 什么是System.map文件?
  • 2. System.map文件解析
  • 3. System.map关键符号
    • 3.1 _stext
    • 3.2 __initramfs_start,__initramfs_size
    • 3.3 __log_buf

1. 什么是System.map文件?

在Linux中,System.map文件是内核符号名称及其对应内存地址的映射表。它在内核构建过程中创建,并位于内核源代码树的根目录中(通常是/linux/System.map)。System.map文件由内核的崩溃转储分析工具和一些性能分析工具使用,以将内核地址映射到它们对应的符号名称。

System.map文件是一个纯文本文件,对于每个符号,它包含三列信息:符号的虚拟地址、符号类型(函数、数据等)和符号名称。虚拟地址是符号所在内核内存中的位置。符号类型指示符号是函数、变量还是某种其他类型的数据。符号名称是符号在内核源代码中出现的名称。

虽然System.map文件对于Linux内核的正常操作不是必需的,但对于需要分析内核崩溃或性能问题的开发人员和系统管理员来说,它是一个重要的工具。它允许他们在崩溃或性能瓶颈发生时,确定正在执行的确切内核代码,并通过内核跟踪执行流程以诊断问题的根本原因。

2. System.map文件解析

  • (1) System.map文件的格式:地址 类型 符号。
  • (2) 符号类型:大写为全局符号,小写为局部符号。
A:该符号的值是不能改变的,等于const
B:该符号来自于未初始化代码段bss段
C: 该符号是通用的,通用的符号指未初始化的数据。当链接时,多个通用符号可能对应一个名称,如果该符号在某一个位置定义,这个通用符号被当做未定义的引用。不明白,内核中也没有该类型的符号
D: 该符号位于初始化的数据段
G: 位于初始化数据段,专门对应小的数据对象,比如global int x,对应的大数据对象为 数组类型等
I: 到其他符号的间接引用,是对于a.out文件的GNU扩展,使用非常少
N:调试符号
R:只读代码段的符号
S:BSS段(未初始化数据段)的小对象符号
T:代码段符号,全局函数,t为局部函数
U:未定义的符号
V:该符号是一个weak object,当其连接到为定义的对象上上,该符号的值变为0
W: 类似于V
—: 该符号是a.out文件中的一个stabs symbol,获取调试信息
?: 未知类型的符号
U:未定义的符号

3. System.map关键符号

3.1 _stext

_stext符号是内核的入口,具体从arch/arm64/kernel/vmlinux.lds.S查看。

3.2 __initramfs_start,__initramfs_size

__initramfs_start,__initramfs_size是buildin进内核的ramdisk的段。

3.3 __log_buf

__log_buf段为日志缓存起始地址,日志缓存大小可以从log_buf_len段获取。