System.map文件【转】

转自:http://blog.csdn.net/david104/article/details/7194185

当运行GNU链接器gld(ld)时若使用了"-M"选项,或者使用nm命令,则会在标准输出设备(通常是屏幕)上打印出链接映像(link map)信息,即是指由链接程序产生的目标程序内存地址映像信息。其中列出了程序段装入到内存中的位置信息。具体来讲有如下信息:

目标文件及符号信息映射到内存中的位置。

公共符号如何放置。

链接中包含的所有文件成员及其引用的符号。

通常我们会把发送到标准输出设备的链接映像信息重定向到一个文件中(例如System.map)。在编译内核时,Linux/Makefile文件产生的System.map文件就用于存放内核符号表信息。符号表是所有内核符号及其对应地址的一个列表,当然也包括上面说明的_etext、_edata和_end等符号的地址信息。随着每次内核的编译,就会产生一个新的对应System.map文件。当内核运行出错时,通过System.map文件中的符号表解析,就可以查到一个地址值对应的变量名,或反之。

利用System.map符号表文件,在内核或相关程序出错时,就可以获得我们比较容易识别的信息。符号表的样例如下所示:

其中每行说明一个符号,第1栏指明符号值(地址);第2栏是符号类型,指明符号位于目标文件的哪个区(sections)或其属性;第3栏是对应的符号名称。

第2栏中的符号类型指示符通常有表3-5所示的几种,另外还有一些与采用的目标文件格式相关。如果符号类型是小写字符,则说明符号是局部的;如果是大写字符,则说明符号是全局的(外部的)。参见文件include/a.out.h中nlist{}结构n_type字段的定义(第110~185行)。

表3-5  目标文件符号列表文件中的符号类型

 

可以看出名称为dmi_broken的变量位于内核地址0xc03441a0处。

System.map位于使用它的软件(例如内核日志记录后台程序klogd)能够寻找到的地方。在系统启动时,如果没有以一个参数的形式为klogd给出System.map的位置,则klogd将会在三个地方搜寻System.map。依次为:

 

尽管内核本身实际上不使用System.map,但其他程序,像klogd、lsof、ps以及dosemu等许多软件都需要有一个正确的System.map文件。利用该文件,这些程序就可以根据已知的内存地址查找出对应的内核变量名称,便于对内核的调试工作。

时间: 2024-07-29 09:52:21

System.map文件【转】的相关文章

Linux System.map文件【转】

转自:http://blog.csdn.net/ysbj123/article/details/51233618 当运行GNU链接器gld(ld)时若使用了"-M"选项,或者使用nm命令,则会在标准输出设备(通常是屏幕)上打印出链接映像(link map)信息,即是指由链接程序产生的目标程序内存地址映像信息.其中列出了程序段装入到内存中的位置信息.具体来讲有如下信息: 目标文件及符号信息映射到内存中的位置. 公共符号如何放置. 链接中包含的所有文件成员及其引用的符号. 通常我们会把发送

auto make System.map to C header file

#!/bin/bash # auto make System.map to C header file # 说明: # 该脚本主要是将Linux内核生成的System.map文件中的符号.地址存入结构体中, # 目前认为也许可以在内核驱动中直接调用对应的函数.以前在学习裸板开发中就有 # 使用Uboot中提供的printf来写程序的先例,那么这里应该也是可以的,不过这里没 # 有什么实用性,因为5W个函数,但这个结构体就要用掉进200kByte空间. # # 2016-3-19 深圳 南山平山村

关于MAP文件的使用

 关于MAP文件的使用 - j2mefans 收藏 导读: 在看<深入理解计算机系统>的时候总会看到MAP文件,一直不懂,今天看到一片相关的文章,收录下来,大家一起看看吧.毕竟有些时候我们的IDE提示的信息不够明白,使用MAP文件是一个调试的好帮手. 仅通过崩溃地址找出源代码的出错行 作为程序员,我们平时最担心见到的事情是什么?是内存泄漏?是界面不好看?--错啦!我相信我的看法是不会有人反对的--那就是,程序发生了崩溃! "该程序执行了非法操作,即将关闭.请与你的软件供应商联系.&q

如何定位Release 版本中程序崩溃的位置 ---利用map文件 拦截windows崩溃函数

1       案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的"名言",恐怕是程序员最怕见也最常见的东西了. 在一个大型软件的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现程序崩溃并不可怕,反而是测试的成功.作为开发的我们更需要关心的是程序中的哪个函数或哪一行导致了系统崩溃,这样才能有针对性的进行改正. 本文描述了自己总结的几种定位崩溃

VS2005(vs2008,vs2010)使用map文件查找程序崩溃原因

VS 2005使用map文件查找程序崩溃原因     一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一个比较好的方法来找原因,通过生成map文件,由于2005取消map文件生成行号信息(vc6.0下是可以生成行号信息的,不知道microsoft怎么想的,在2005上取消了),只能定位在那个函数发生崩溃.这里可以通过生成cod文件,即机器码这一文件,具体定位在那一行崩溃.  首先配置vc2005生成ma

Moose File System分布文件系统测试

moosefs是一个开源的分布文件系统软件,可提供高效,可靠的数据存储能力.配置,维护都比较简单. MOOSEFS对离散读写的性能提升明显. 建议底层使用xfs文件系统,支持更大的文件系统和更多的文件,这个的话rhel6已经加入支持了. 整个分布存储系统由三部分组成: master: 存储数据位图,权限信息,提供客户端挂载接口,提供图形管理接口等. metalog(optional) master服务器的备份. chunkserver 数据存储服务器,负责存储数据. clientserver 挂

arm上加载insmod驱动时出现Unknown symbol in module

问题 这几天在arm上做蓝牙耳机驱动的时候,编译好了驱动但是在板子上insmod时候. 怎么会出现这种情况,不对呀,仔细查我们会发现,其实编译驱动的时候,就出现了一些警告,只是当时没有在意而已,而恰恰是这些警告导致的这些问题. 硬件设备 板子用的是realarm 内核linux-2.6.35 交叉编译器arm-linux-gcc 4.4.3 问题解析 究其原因,其原因就是我们的驱动找不到内核的几个函数,我们可以看到我们找不到的函数有两个,一个是kill_proc_info 一个是snd_hwde

内存屏障机制及内核相关源代码分析

1.--->ymons 在www.linuxforum.net Linux内核技术论坛发贴问:set_current_state和__set_current_state的区别? #define __set_current_state(state_value) /do { current->state = (state_value); } while (0) #define set_current_state(state_value) /set_mb(current->state, (st

u-boot-1.3.4 移植到S3C2440

一.预备知识: 1.       首先, U-Boot1.3.4 还没有支持 s3c2440 ,移植仍是用 2410 的文件稍作修改而成的. 2.       2440 和 2410 的区别: 2440和 2410的区别主要是 2440的主频更高,增加了摄像头接口和 AC'97音频接口:寄存器方面,除了新增模 块的寄存器外,移植所要注意的是 NAND FlASH控制器的寄存器有较大的变化.芯片的时钟频率控制寄存器(芯片 PLL的寄存器)有一定的变化.其他寄存器基本是兼容的. 3.  你开发板的