System.map是一个特定内核的内核符号表。它是你当前运行的内核的System.map的链接。

内核符号表是怎么创建的呢? System.map是由“nm vmlinux”产生并且不相关的符号被滤出。对于本文中的例子,编译内核时,System.map创建在/usr/src/linux-2.4/System.map。像下面这样:

nm /boot/vmlinux-2.4.7-10 > System.map

下面几行来自/usr/src/linux-2.4/Makefile:

nm vmlinux | grep -v ‘(compiled)|(.o$$)|( [aUw] )|(..ng$$)|(LASH[RL]DI)’ | sort > System.map

然后复制到/boot:

cp /usr/src/linux/System.map /boot/System.map-2.4.7-10

在进行程序设计时,会命名一些变量名或函数名之类的符号。Linux内核是一个很复杂的代码块,有许许多多的全局符号。

Linux内核不使用符号名,而是通过变量或函数的地址来识别变量或函数名。比如不是使用size_t BytesRead这样的符号,而是像c0343f20这样引用这个变量。

对于使用计算机的人来说,更喜欢使用那些像size_t BytesRead这样的名字,而不喜欢像c0343f20这样的名字。内核主要是用c写的,所以编译器/连接器允许我们编码时使用符号名,当内核运行时使用地址。

然而,在有的情况下,我们需要知道符号的地址,或者需要知道地址对应的符号。这由符号表来完成,符号表是所有符号连同它们的地址的列表。Linux 符号表使用到2个文件:

/proc/ksyms

System.map

/proc/ksyms是一个“proc file”,在内核引导时创建。实际上,它并不真正的是一个文件,它只不过是内核数据的表示,却给人们是一个磁盘文件的假象,这从它的文件大小是0可以看 出来。然而,System.map是存在于你的文件系统上的实际文件。当你编译一个新内核时,各个符号名的地址要发生变化,你的老的System.map 具有的是错误的符号信息。每次内核编译时产生一个新的System.map,你应当用新的System.map来取代老的System.map。

虽然内核本身并不真正使用System.map,但其它程序比如klogd, lsof和ps等软件需要一个正确的System.map。如果你使用错误的或没有System.map,klogd的输出将是不可靠的,这对于排除程序 故障会带来困难。没有System.map,你可能会面临一些令人烦恼的提示信息。

另外少数驱动需要System.map来解析符号,没有为你当前运行的特定内核创建的System.map它们就不能正常工作。

Linux的内核日志守护进程klogd为了执行名称-地址解析,klogd需要使用System.map。System.map应当放在使用它的 软 件能够找到它的地方。执行:man klogd可知,如果没有将System.map作为一个变量的位置给klogd,那么它将按照下面的顺序,在三个地方查找System.map:

/boot/System.map

/System.map

/usr/src/linux/System.map

System.map也有版本信息,klogd能够智能地查找正确的映象(map)文件。

System.map内部符号定义:

这些代表符号类型. 小写代表本地符号,大写代表外部符号.


The symbol's value is absolute, and will not be changed by further linking.


The symbol is in the uninitialized data section (known as BSS).


The 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. For more details on common symbols, see the discussion of -warn-common in Linker options.


The symbol is in the initialized data section.


The 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.


The symbol is an indirect reference to another symbol. This is a GNU extension to the a.out object file format which is rarely used.


The symbol is a debugging symbol.


The symbol is in a read only data section.


The symbol is in an uninitialized data section for small objects.


The symbol is in the text (code) section.


The symbol is undefined.


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.


The 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 weak symbol becomes zero with no error.


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. For more information, see Stabs.


The symbol type is unknown, or object file format specific.

 转自:http://blog.chinaunix.net/uid-17188120-id-2820834.html
 
用nm查看详细信息。

最新文章

  1. PHP WAMP 文件上传 及 简单的上传预览
  2. linux安装php & nginx
  3. JavaScript基础插曲-练习
  4. Eclipse常用开发插件
  5. 连接ssql语句
  6. shell中如何判断某一命令是否存在
  7. jQuery Callback 函数
  8. setTimeout、clearTimeout、setInterval,clearInterval ——小小计时器
  9. 灯塔(LightHouse)
  10. 关于ztree打开关闭所有节点,选中指定id节点
  11. keil5之32环境配置
  12. 【转载】makefile经典教程
  13. HTML中的超链接
  14. 计算机网络相关:应用层协议(二):HTTP
  15. python网络编程 双人多人聊天
  16. centoos内核升级
  17. 从零开始学 Web 之 移动Web(九)微金所案例
  18. 实验1--用C语言编程四则运算
  19. 微信小程序《沈航二手书》
  20. 五、java面向对象编程_3

热门文章

  1. iOS - OC 与 C 互相操作
  2. Symantec Backup Exec(BE)的启停
  3. Android多点触摸放大缩小图片
  4. 【驱动笔记9】初探IRP
  5. git配置gitignore
  6. Note for video Machine Learning and Data Mining——training vs Testing
  7. STM32 SPI接口的NSS引脚
  8. 【转载】BasicDataSource配置说明
  9. Python UNICODE GBK UTF-8 之间相互转换
  10. 利用ichart绘制网页图表