2014-08-30 43 views
0

我寫了一個模塊,嘗試在調用原始do_fork地址之前嘗試更改導出符號'do_fork'的地址以指向我的函數。到目前爲止,我似乎無法更改地址,因爲它給了我錯誤'作爲賦值左操作數所需的左值'。我不知道如何改變指向我的函數do_fork()的指針fake_fork();我不知道如何改變指針do_fork()到我的函數fake_fork();我不知道如何改變指針do_fork()到我的函數。更改內核函數指針的地址

#include <linux/fs.h> 
#include <linux/init.h> 
#include <linux/proc_fs.h> 
#include <linux/seq_file.h> 
#include <linux/sched.h> 
#include <linux/module.h> 

int c=0; 

long fake_fork(unsigned long a, unsigned long b, unsigned long c, int __user *d, int __user *e) 
{ 
    ++c; 

    return do_fork(a, b, c, d, e); 
} 

EXPORT_SYMBOL(fake_fork); 

static int fork_proc_show(struct seq_file *m, void *v) 
{ 
    seq_printf(m, "System Call fork called: %d times.\n", c); 
    return 0; 
} 

static int fork_proc_open(struct inode *inode, struct file *file) 
{ 
    return single_open(file, fork_proc_show, NULL); 
} 

static const struct file_operations fork_proc_fops = { 
    .open  = fork_proc_open, 
    .read  = seq_read, 
    .llseek  = seq_lseek, 
    .release = single_release, 
}; 

static int __init proc_fork_init(void) 
{ 
    do_fork = fake_fork; // <-- Not working 

    printk("init proc forkcounter\n"); 
    proc_create("forkcounter", 0, NULL, &fork_proc_fops); 
    return 0; 
} 

static void __exit cleanup_fork_module(void) 
{ 
    remove_proc_entry("forkcounter",NULL); 

    printk("cleanup proc forkcounter\n"); 
} 

module_init(proc_fork_init); 
module_exit(cleanup_fork_module); 
+0

爲什麼不直接在需要時直接調用'fake_fork()'? – 2014-08-30 11:41:22

回答

3

您不能更改do_fork,它是運行時的常量。它是do_fork()函數的地址。

你不能分配任何東西給一個函數。這是因爲函數的名稱不是變量。這是一個常量指針。

這是一樣的

5 = 2 + 2; 

你會得到同樣的錯誤消息。

我假設你希望你的函數每次調用do_fork()時被調用。這將會變得更加複雜。我會以this link爲例。

+0

感謝您的回覆。對於所有EXPORT_SYMBOL'd符號,它們都是常量並且不能更改嗎? – 2014-08-30 12:14:55

+0

是的,但不是因爲'EXPORT_SYMBOL'。例如,你不能指定'fake_fork',但如果你刪除了'EXPORT_SYMBOL(fake_fork)',你仍然不能分配給它。這是因爲函數的名稱不是變量。這是一個不變的指針。 – 2014-08-30 12:37:13

+0

我更新了我的回答 – 2014-08-30 12:55:39