深入系统地了解system.map 文件

一、system.map文件

system.map 文件是Linux系统内核的一个重要文件,该文件记录了系统运行时的大量信息。此文件包含了内核代码符号表,指令地址、数据地址、BSS区地址等等信息。system.map 文件在内核构建时生成,其生成方式有多种。一个典型的system.map 文件包含类似于以下的信息:

c011d684 t reserve_bootmem
c011d68c t free_bootmem
c011d7e0 t pagetable_init
c011d8a8 t copy_kernel
c011d8c8 T copy_user
c011d8e0 T copy_to_user
c011d900 T copy_from_user
c011d920 T strcpy_from_user
c011d940 T strncpy_from_user
c011d960 T strlen_user

上述信息中每个符号的前6个字符是该符号的地址。其中t表示此符号是一个本地代码符号,T表示此符号是一个可导出的代码符号。

二、system.maplibraryname

Linux系统中的库文件也会有对应的system.map 文件,其具有类似的作用。system.maplibraryname 用于指定库文件名。

/lib/modules/2.6.9-55.ELsmp/kernel/fs/gfs/gfs.ko:
00000000 A gfs_lmhosts
00000000 A gfs_lockstate
00000000 A gfs_tune
00000000 A gfs_quota
00000000 A gfs_qrlock
00000000 A gfs_dir
00000000 A gfs_loghead
00000000 A gfs_quota_lock
00000000 A gfs_log_heads
00000000 A gfs_rindex
00000000 A jid_column
00000000 A dqblk_column
00000000 A inode_column
00000000 A timer_mgr

三、system.map在哪

系统默认位置 /boot/System.map-`uname -r`。

四、system.map 符号表

system.map 文件记录了大量与内核代码,内核模块和系统所有符号相关的信息。其中符号表记录每个符号的具体位置。这里是一个示例:

c0008000 T _stext
c0008400 T __exception_table_start
c00084c4 T __exception_table_end
c0008520 T _sinittext
c007fb14 T _etext
c007fc3c T _sdata

表中列出了一些Linux内核的符号,包括起始地址(例如_stext)和结束地址(例如_etext),该地址是可执行文件中对应的代码段的虚拟地址,T表示代码符号,具有全局作用域。

五、system.map和module.symvers

对内核的开发人员而言,使用已经编译的内核模块和在内核源代码中开发新模块都是必要的。这里有两个文件是必备的

module.symvers是内核模块的一个关键文件,如果缺失会导致编译模块时遇到问题。system.map 文件和 module.symvers 文件都包含符号表,它们的唯一区别在于生成方式不同。module.symvers 表示一个开发版本的内核,记录了当前情况下所有可用的地址符号和其对应的版本信息。

六、system.map 查询地址

可以使用符号名来查询某个符号的地址,例如下面的命令查询了符号init的地址:

$ grep '\' /boot/System.map-`uname -r`
c1041630 T init

七、system.map 解析地址

system.map 可以被用来查询内核中的符号、函数、变量等等,这样可以方便地进行内核分析、调试、编译以及模块的开发等工作。下面是一个如何解析与显示符号的地址的例子:

#include
#include
int main()
{
    printf(“Address of getchar() function: %p\n”, getchar);
    printf(“Address of the read() function: %p\n”, read);
    return 0;
}

在shell里面运行命令“make test”即可得到Address of getchar() function: xxxxxxxx,其中xxxx表示getchar 函数的地址。可以使用获取到的函数地址进行代码的调试、分析以及二进制文件的反汇编等多种操作。

八、总结

system.map 是Linux中一个很重要的内核文件。在操作系统的编译过程中生成,它记录了Linux内核中大量的相关信息,包括符号表和地址信息。system.map 文件和 module.symvers 文件都包含符号表,而它们的唯一区别在于生成方式不同。开发人员可以使用 system.map 文件来进行内核分析、调试、编译以及模块的开发等工作。了解 system.map 文件将对Linux内核的理解有很大帮助。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/155046.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-17 02:37
下一篇 2024-11-17 02:37

相关推荐

  • vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常问题的解决

    本文旨在解决vue下载无后缀名的文件被加上后缀.txt,有后缀名的文件下载正常的问题,提供完整的代码示例供参考。 一、分析问题 首先,需了解vue中下载文件的情况。一般情况下,我们…

    编程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件并生成完整的图像

    OBJ格式是一种用于表示3D对象的标准格式,通常由一组顶点、面和纹理映射坐标组成。在本文中,我们将讨论如何将多个OBJ文件拼接在一起,生成一个完整的3D模型。 一、读取OBJ文件 …

    编程 2025-04-29
  • Deepin系统分区设置教程

    本教程将会详细介绍Deepin系统如何进行分区设置,分享多种方式让您了解如何规划您的硬盘。 一、分区的基本知识 在进行Deepin系统分区设置之前,我们需要了解一些基本分区概念。 …

    编程 2025-04-29
  • 为什么用cmd运行Java时需要在文件内打开cmd为中心

    在Java开发中,我们经常会使用cmd在命令行窗口运行程序。然而,有时候我们会发现,在运行Java程序时,需要在文件内打开cmd为中心,这让很多开发者感到疑惑,那么,为什么会出现这…

    编程 2025-04-29
  • Python程序文件的拓展

    Python是一门功能丰富、易于学习、可读性高的编程语言。Python程序文件通常以.py为文件拓展名,被广泛应用于各种领域,包括Web开发、机器学习、科学计算等。为了更好地发挥P…

    编程 2025-04-29
  • Python中读入csv文件数据的方法用法介绍

    csv是一种常见的数据格式,通常用于存储小型数据集。Python作为一种广泛流行的编程语言,内置了许多操作csv文件的库。本文将从多个方面详细介绍Python读入csv文件的方法。…

    编程 2025-04-29
  • Python将矩阵存为CSV文件

    CSV文件是一种通用的文件格式,在统计学和计算机科学中非常常见,一些数据分析工具如Microsoft Excel,Google Sheets等都支持读取CSV文件。Python内置…

    编程 2025-04-29
  • Python zipfile解压文件乱码处理

    本文主要介绍如何在Python中使用zipfile进行文件解压的处理,同时详细讨论在解压文件时可能出现的乱码问题的各种解决办法。 一、zipfile解压文件乱码问题的根本原因 在P…

    编程 2025-04-29
  • Python如何导入py文件

    Python是一种开源的高级编程语言,因其易学易用和强大的生态系统而备受青睐。Python的import语句可以帮助用户将一个模块中的代码导入到另一个模块中,从而实现代码的重用。本…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29

发表回复

登录后才能评论