社区新版论坛已上线,点击立即前往!使用 openKylin 账户授权登录,解锁更多体验!

openKylin论坛

 找回密码

关于导出内核函数符号问题 [复制链接]

本帖最后由 andrewyang83 于 2015-3-26 11:14 编辑

最近在折腾内核,主要是想研究/boot/System.map与/proc/kallsyms之间关系的问题。

  • 形成过程
Linux内核符号表/proc/kallsyms的形成过程

./scripts/kallsyms.c负责生成System.map
./kernel/kallsyms.c负责生成/proc/kallsyms
./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage
内核启动后./kernel/kallsyms.c解析uImage形成/proc/kallsyms

  • 内核配置
2.6内核中,为了更好地调试内核,引入了kallsymskallsyms抽取了内核用到的所有函数地址(全局的、静态的)非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。需要配置CONFIG_KALLSYMS
.config

  1. CONFIG_KALLSYMS=y   符号表中包含所有的函数
  2. CONFIG_KALLSYMS_ALL=y 符号表中包括所有的变量(包括没有用EXPORT_SYMBOL导出的变量)
  3. CONFIG_KALLSYMS_EXTRA_PASS=y
复制代码

make menuconfig
  1. General setup  --->  
  2.     [*] Configure standard kernel features (for small systems)  --->
  3.         [*]   Load all symbols for debugging/ksymoops (选中此项,才有/proc/kallsyms接口文件, oops问题,选中此选项即可,子选项可以忽略)

  4.               [*]   Include all symbols in kallsyms
  5.               [*]   Do an extra kallsyms pass  
复制代码

发现在编译内核导出符号表时需要注意以下问题:
  • 要在一个内核中启用 kallsyms 功能,必须如下设置.config文件
  1. CONFIG_KALLSYMS=y
复制代码
  • 要在kallsyms中包含全部符号信息,则必须设置.config文件
  1. <font color="Black">CONFIG_KALLSYMS_ALL=y</font>
复制代码
开始没有开启第二开关,导致system.map有的符号而kallsyms中却没有

编译出来后,通过如下命令对比发现有很大的数量出入
  1. $ sudo cat /boot/System.map-`uname -r`|wc -l
  2. $ sudo cat /proc/kallsyms|wc -l
复制代码

进一步对比,发现/proc/kallsyms中增加的函数符号是后来安装的软件中引入的,而system.map则仅仅是kenrel编译时生成的符号表,
例如,我在/proc/kallsym中发现了pps_*这样的符号尽然就有24个,而System.map中没有,同样dev_attr_*在System.map中
比/prco/kallsyms要少90多个

此外,在/proc/kallsyms中,发现第四列(如果有的话)用中括号将核外导入的module名括起来

查考文献: linux内核符号表kallsyms

楼主
发表于 2015-3-26 10:41:25
回复

使用道具 举报

关于导出内核函数符号问题 [复制链接]

其中/boot/System.map文件是kernel编译时通过scripts/mksysmap脚本生成的,而/proc/kallsyms文件在启动时根据System.map形成,

需要注意的是,目前内核中对/proc/kallsyms文件的读取进行了保护,即当采用root用户(或执行sudo cat)查看是,其符号地址与/boot/System.map中一致,

而采用普通用户查看/proc/kallsyms时,符号地址均进行了隐藏,全为16个0
沙发
 楼主| 发表于 2015-3-26 11:01:33
回复

使用道具 举报

openKylin

GMT+8, 2024-6-15 12:09 , Processed in 0.019955 second(s), 17 queries , Gzip On.

Copyright ©2022 openKylin. All Rights Reserved .

ICP No. 15002470-12 Tianjin

快速回复 返回顶部 返回列表