如何在内核源代码中的 fork.c 中设置断点以获取函数的地址



祝大家美好的一天。我有这个疑问,我希望有人能够帮助我。我提前表达我的感激和感谢。我做了几个小时的搜索,但找不到解决方案。

我的问题:

我需要获取以下代码片段的"security_task_create(clone_flags)"函数的地址(位于第 926 行,fork.c 根据"/usr/src/linux-2.6.27/kernel/fork.c") -:

************************************ ************************************ 
static struct task_struct *copy_process(unsigned long clone_flags,
unsigned long stack_start,
struct pt_regs *regs,
unsigned long stack_size,
int __user *child_tidptr,
struct pid *pid,
int trace)
{
int retval;
struct task_struct *p;
int cgroup_callbacks_done = 0;
if ((clone_flags & (CLONE_NEWNS|CLONE_FS)) == (CLONE_NEWNS|CLONE_FS))
return ERR_PTR(-EINVAL);
/*
* Thread groups must share signals as well, and detached threads
* can only be started up within the thread group.
*/
if ((clone_flags & CLONE_THREAD) && !(clone_flags & CLONE_SIGHAND))
return ERR_PTR(-EINVAL);
/*
* Shared signal handlers imply shared VM. By way of the above,
* thread groups also imply shared VM. Blocking this case allows
* for various simplifications in other code.
*/
if ((clone_flags & CLONE_SIGHAND) && !(clone_flags & CLONE_VM))
return ERR_PTR(-EINVAL);
****retval = security_task_create(clone_flags);****
if (retval)
goto fork_out;
retval = -ENOMEM;
p = dup_task_struct(current);
if (!p)
goto fork_out;
rt_mutex_init_task(p);
************************************ ************************************ 

我已经在带有内核 3.1.7 的 Fedora Core 16 机器中通过键盘启用了 KDB 访问。进入KDB控制台即" kdb[0]>后,我输入了security_task_create并显示了一个十六进制地址,例如0x0040118e。

我的问题:

  1. 显示的十六进制地址 - 内核上security_task_create的地址是否加载?

2.如果没有,我如何获取security_task_create函数的地址?如何配置 KDB 获取security_task_create函数的地址?

  1. 我想到的是当内核在内存中运行时,使用 KDB 在 fork.c 的第 926 行插入一个断点security_task_create。如果这确实是正确的解决方案,我如何使用这种方法获取security_task_create的地址?

要获取内核中任何符号的地址,只需使用 System.map 文件即可。

需要在内核配置中启用CONFIG_KALLSYMS以获取该文件中的所有符号。

只需在您的源目录中使用 printk 的 grep,我相信您会找到大量示例。

printk(KERN_INFO "fork(): process `%s' used deprecated "
                    "clone flags 0x%lxn",
                get_task_comm(comm, current),
                clone_flags & CLONE_STOPPED);

最新更新