【问题标题】:linux kernel module assignment makes integer from pointer without a castlinux内核模块分配从指针中生成整数而没有强制转换
【发布时间】:2012-11-10 15:45:03
【问题描述】:

这是简单的 sys_call_table 挂钩代码

#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");

我收到如下警告

此代码工作正常,但我想删除警告。我该怎么办?

/home/tester/tools/lkm/a.c:在函数“init_module”中:
/home/tester/tools/lkm/a.c:33:警告:赋值从没有强制转换的指针生成整数
/home/tester/tools/lkm/a.c:34:警告:赋值从没有强制转换的指针生成整数
/home/tester/tools/lkm/a.c:在函数“cleanup_module”中:
/home/tester/tools/lkm/a.c:40:警告:赋值从指针中生成整数而无需强制转换

【问题讨论】:

  • @alk:我已经为这些行号添加了标记。 . .虽然实际上,这两个函数都足够短,甚至不需要标记。
  • 谢谢。我觉得标记线是 OP 在期待帮助时可以提供的最低要求的一部分,而无需任何重大努力。

标签: c linux linux-kernel linux-device-driver


【解决方案1】:

如果您想使编译器静音,则必须添加类型转换(即使这通常是个坏主意,但编译器就是这样做的)。

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;
}

【讨论】:

    【解决方案2】:

    当你查看第 33 行时,你会发现问题:

    orig_open = sys_call_table[__NR_open];

    您已将sys_call_table 定义为指向整数的指针。这就是警告的原因。 其他行也有同样的问题。如果你正确定义sys_call_table,警告就会消失。

    您至少应该将其定义为指针数组或指向指针的指针,因为如果ssize_t 在 64 位系统上只有 32 位,您可能会将 64 位地址截断为 32 位整数。

    【讨论】:

      猜你喜欢
      • 2015-10-19
      • 2013-09-14
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多