LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2259|回复: 5

怎样从kernel源码中众多的同名函数中,区分出哪一个才与我们相关的

[复制链接]
发表于 2009-8-22 16:18:36 | 显示全部楼层 |阅读模式
小弟,我正准备读内核源码,其中有些同名函数会在很多文件中被定义,怎样快速找到哪个函数定义才是与我们有关的呢?

比如:以setup_arch函数为例,在内核中有很多个文件都定义了它,我怎么能快速的知道,哪个文件中定义的setup_arch函数才是我的S3C2440所需要的呢?

我知道,linux/arch/arm/kernel/setup.c文件中定义的那个setup_arch函数是我的S3C2440所需要的,但是这是需要分析才知道的。

在u-boot中,就有一种快速方法“从众多的同名函数中找到与我们相关的那一个”:
编译出来完的uboot会生成一个u-boot.map文件,你只要以这个“函数的名字”为关键字去u-boot.map中查找,就能找到编译出来的uboot映像,使用的是哪个文件中的函数了。
比如:uboot源码中对icache_enable函数的定义会存在于很多文件中,那么到底哪个才是与我们有关的呢?
我们只要去u-boot.map文件查找“icache_enable ”,就会看到:
“ .text          0x33f98f18      0x104 cpu/arm920t/libarm920t.a(cpu.o)
                0x33f98fb8                icache_status
                0x33f98fe4                icache_enable    “
所以cpu/arm920t/libarm920t.a(cpu.o)也就是cpu/arm920t/cpu.c中定义的icache_enable函数才是真正编译进内核的,也就是我们所需要的。



所以,我的问题是kernel中有没有一个和“u-boot.map”相似的文件,能让我快速的从众多同名函数中找到哪个才是真正编译进映像文件的那个?
发表于 2009-8-27 10:19:42 | 显示全部楼层
我也想知道,一直都是自己分析后才知道的
请大侠指点下,有没有更好的办法!
回复 支持 反对

使用道具 举报

发表于 2009-9-29 21:23:46 | 显示全部楼层
我也是类似的疑问!

苦恼!
回复 支持 反对

使用道具 举报

发表于 2009-10-5 20:42:49 | 显示全部楼层
加printk在每个函数,然后看哪一个打印出来就是了,记得如果是
一个频繁调用的函数的话,最好加一个静态变量来控制
只打印一次
如:
a()
{
static ONCE = 1;
if (ONCE ) {
printk("in /src/include/ccc...\ n");
};
ONCE = 0;
}
回复 支持 反对

使用道具 举报

发表于 2009-10-19 09:35:12 | 显示全部楼层
楼上的方法太麻烦了吧,还要重新编译内核,请高手介绍点好方法
回复 支持 反对

使用道具 举报

发表于 2009-10-19 10:05:14 | 显示全部楼层
Post by shiyuzhu;2019089
小弟,我正准备读内核源码,其中有些同名函数会在很多文件中被定义,怎样快速找到哪个函数定义才是与我们有关的呢?  ......  


你好,本书的最后一章专门讨论下列问题,
http://www.china-pub.com/195695&ref=ps
第13章 常用内核分析方法
  13.1 准确定位同名宏及结构体
  [color="Red"]13.2 准确定位同名函数   <---- 这就是你关心的  
   13.3 利用linkcmapc文件定位全局变量
  13.4 准确定位函数调用线索
  13.5 SystemTapc在代码分析中的使用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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