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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

正在起飞的蜗牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值