2012-11-10 68 views
1

很簡單sys_call_table的掛鉤代碼Linux內核模塊分配時將指針整數,未作鑄

#include <asm/unistd.h> 
#include <linux/autoconf.h> 
#include <linux/in.h> 
#include <linux/init_task.h> 
#include <linux/ip.h> 
#include <linux/kernel.h> 
#include <linux/kmod.h> 
#include <linux/mm.h> 
#include <linux/module.h> 
#include <linux/sched.h> 
#include <linux/skbuff.h> 
#include <linux/stddef.h> 
#include <linux/string.h> 
#include <linux/syscalls.h> 
#include <linux/tcp.h> 
#include <linux/types.h> 
#include <linux/unistd.h> 
#include <linux/version.h> 
#include <linux/workqueue.h> 

ssize_t *sys_call_table = (ssize_t *)0xc0026e04; 

asmlinkage ssize_t (*orig_open)(const char *pathname, int flags); 

asmlinkage ssize_t hacked_open(const char *pathname, int flags) 
{ 
    printk(KERN_INFO "SYS_OPEN called : %s\n", pathname); 
    return orig_open(pathname, flags); 
} 

int init_module(void) 
{ 
    orig_open = sys_call_table[__NR_open];  /* line 33 */ 
    sys_call_table[__NR_open] = hacked_open; /* line 34 */ 
    return 0; 
} 

void cleanup_module(void) 
{ 
    sys_call_table[__NR_open] = orig_open;  /* line 40 */ 
} 

MODULE_LICENSE("GPL"); 

我有類似下面

此代碼工作正常的警告,但我想刪除警告。我能怎麼做?

/家/測試/工具/ LKM/AC:在功能 '的init_module':
/家/測試/工具/ LKM/AC:33:警告:分配使得整數指針沒有投
/家/測試/工具/ LKM/AC:34:警告:賦值時將指針整數,未作鑄
/家/測試/工具/ LKM/AC:在函數 '在cleanup_module':
/家/測試/工具/ lkm/ac:40:警告:賦值使指針中的整數無指針

+0

@alk:我爲這些行號添加了標記。 。 。雖然真的,但這些功能都足夠短,甚至不需要標記。 – ruakh

+0

謝謝。我覺得,在預期幫助時,標記線是OP可以在沒有任何重大努力的情況下提供的最低限度的一部分。 – alk

回答

0

如果你wan要沉默你的編譯器,你必須添加類型轉換(即使它通常是一個糟糕的主意,這是你的編譯器改變它的方式)。

ssize_t *sys_call_table = (ssize_t *)0xc0026e04; 

typedef ssize_t (*ftype)(const char *, int); 

ftype orig_open; 

ssize_t hacked_open(const char *pathname, int flags) 
{ 
    printf("SYS_OPEN called : %s\n", pathname); 
    return orig_open(pathname, flags); 
} 

int init_module(void) 
{ 
    orig_open = (ftype)sys_call_table[__NR_open]; 
    sys_call_table[__NR_open] = (ssize_t)hacked_open; 
    return 0; 
} 
0

當你看線33,你會看到該問題:

orig_open = sys_call_table的[__ NR_open];

您已將sys_call_table定義爲指向整數的指針。這是警告的原因。 與其他線路相同的問題。如果您正確定義sys_call_table,則警告將消失。

您至少應該將其定義爲指針數組或指針指針,因爲如果ssize_t在64位系統上只有32位,則可能會將64位地址截斷爲32位整數。