System.map文件详解

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了System.map文件详解相关的知识,希望对你有一定的参考价值。

什么是System.map文件?

System.map文件记录了所有符号的运行地址,这里的符号可以理解成函数名和变量。通过查看System.map文件可以帮助我们理解内核编译。System.map文件不是一层不变的,每次编译内核都会重新生成System.map文件。

System.map文件的作用

对计算机而言是没有符号这个概念的,只有0和1;但是我们比较容易理解的是函数名这样的符号,System.map文件就是计算机和人类在理解程序中的桥梁。当程序报错的时候,计算机会在堆栈信息里保存出错的内存地址,但是我们光看内存地址是没法理解程序到底是哪里出错。于是可以把出错的内存地址通过System.map文件转换成函数名,这样我们就知道是哪个函数出错了。我们用gdb调试程序的时候,可以通过函数名设置断点,也是因为在程序中有一份符号表,如果用strip后的程序做gdb调试,在用函数名设置断点的时候会提示找不到函数名,因为程序里的符号信息都被删除了。

System.map文件内容

c0004000 A swapper_pg_dir
c0008000 T __init_begin
c0008000 T _sinittext
c0008000 T _stext
c0008000 T stext
c0008034 t __enable_mmu
c0008060 t __turn_mmu_on
c0008078 t __create_page_tables
c00080f0 t __switch_data
c0008118 t __mmap_switched
c0008160 t __error
c0008160 t __error_a
c0008160 t __error_p
·······

上面是编译内核生成的System.map文件,其中"c0008000 T stext"表示_stext符号的运行地址是0xc0008000,_stext符号是内核的入口,而内核的链接地址也是0xc0008000,两者刚好对应上。

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:未定义的符号

以上是关于System.map文件详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux System.map文件

auto make System.map to C header file

Codeforces水题(C. Registration system map容器的简单应用)

CentOS目录树详细解释

nyoj 991 Registration system (map)

registration system(map+思维)