Linux中,System.map档案是被内核所使用的符号表

符号表是一个在符号名称与它们的记忆体位置间的查询表格。符号名称可能是变数的名称或是函数名称。当要查询符号名称的位置或是特定位置的符号名称时,就会需要System.map。对于内核错误内核oops的除错特别有用。当CONFIG_KALLSYMS启用时,核心会自行做位置到名称的转换,所以像是ksymoops这一类的工具并不是必要的[1]

内部 编辑

以下是System.map档案的一部份内容:[2]

c041bc90 b packet_sklist
c041bc94 b packet_sklist_lock
c041bc94 b packet_socks_nr
c041bc98 A __bss_stop
c041bc98 A _end
c041c000 A pg0
ffffe400 A __kernel_vsyscall
ffffe410 A SYSENTER_RETURN
ffffe420 A __kernel_sigreturn
ffffe440 A __kernel_rt_sigreturn

因为位置在每次构建时都会变动,所以核心每一次新的构建都会产生新的System.map[3]

符号类型 编辑

在位置及符号中间的字符(以空格分开)是符号的类型UNIX操作系统上的nm工具程式列出了所有目标档案的符号。而System.map则是直接与其相关,因为这个档案是在整个核心程式上由nm所产生的 - 就像nm列出任意小的目标程式的符号及它们的类型[4]

这些类型的一部份:[4]

  • A 绝对的
  • Bb 未初始化的资料段(称为BSS)
  • Dd 已初始化的资料段
  • Gg 小目标的已初始化资料段(全域)
  • i 特定的DLL段
  • N 除错符号
  • p 堆叠展开段
  • Rr 唯读资料段
  • Ss 小目标的未初始化资料段
  • Tt 文字(代码)段
  • U 未定义
  • Vv 弱目标
  • Ww 尚未被标记的弱目标
  • - a.out目标档案的符号戳
  • ? “符号类型未知”

档案系统位置 编辑

Linux内核构建完成后,System.map可能位于原始目录的根。然而,另外一些软体可能会希望这个档案位于其他地方:[5]

  • 像是 /boot/System.map-$(uname -r)
  • 在构建SVGALib时预期会找到/lib/modules/$(uname -r)/build/System.map

参考文献 编辑

  1. ^ FAQ/System.map - Linux Kernel Newbies. Kernelnewbies.org. 2006-04-14 [2014-04-06]. (原始内容存档于2014-07-12). 
  2. ^ Peter Jay Salzman. The system.map File. Rlworkman.net. 2003-05-28 [2014-04-06]. (原始内容存档于2014-04-06). 
  3. ^ Kernel-HOWTO. faqs.org. [2014-04-06]. (原始内容存档于2014-04-06). 
  4. ^ 4.0 4.1 nm(1): symbols from object files - Linux man page. Linux.die.net. [2014-04-06]. (原始内容存档于2014-04-02). 
  5. ^ Peter's Notes: System.map. Linuxmafia.com. 2003-05-29 [2014-04-06]. (原始内容存档于2015-07-31). 

参见 编辑