LinuxSir.cn,穿越时空的Linuxsir!

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

模块求助

[复制链接]
发表于 2004-4-22 11:16:30 | 显示全部楼层 |阅读模式
想动态的添加系统调用。
申明:我有259号系调,我直接覆盖了原来的内容
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#incldue <linux/kernel.h>
#incldue <linux/module.h>
#include <linux/init.h>

int sys_add(int a,int b)
{
        int c;
        c=2*(a+b);
        return c;
}

int init_module(void)
{
        extern long sys_call_table[];
        sys_call_table[259]=(unsigned long)sys_add;
        return 0;
}

void cleanup_module(void)
{
        printk("goodbye!\n");
}
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@



#gcc -Wall -DMODULE -D__KERNEL__ -DLINUX -c add.c
(生成了add.o)

#insmod add.o
提示:
add.o:unresolved symbol sys_call_table
add.o:
Hint:You are trying to load a module without a GPL compatible license and it has unresolved symbols. The module may be trying to access GPLONLY symbols but the problem is more likely to be a coding or user error.  Contact the module supplier for assistance,only they can help you .


觉得是init_module()有问题,我不知道sys_call_table[]的类型,这个是仿照书上面写的。请高手指点!


谁可以解释一下这个gcc的意义:
gcc -Wall -02 -DMODULE -D__KERNEL__ -DLINUX -c peda.c. -0 peda time.o
-I/usr/src/linux/include        ---《边干边学-linux内核指导》page 166
发表于 2004-4-25 12:13:04 | 显示全部楼层
在程序的最后加上MODULE_LICENSE ("GPL")。


gcc -Wall -02 -DMODULE -D__KERNEL__ -DLINUX -c peda.c. -0 peda time.o
-I/usr/src/linux/include

man gcc就知道是什么意思了。
发表于 2004-5-18 12:44:43 | 显示全部楼层
加了那个好像也不行,好像是无法解析的
发表于 2004-5-18 13:52:36 | 显示全部楼层
发表于 2004-5-18 14:01:58 | 显示全部楼层
谢谢,我再试试,不知道2.4.20内核能不能导出系统调用表
发表于 2004-5-18 17:06:01 | 显示全部楼层
2.4 内核不导出shs call table了, 你可以使用一下办法解决

cd /boot
cat System.map |grep sys_call_table
记住地址

然后用 把你的
  extern long sys_call_table[];
改为
  long * my_sys_call_table[];
  my_sys_call_table = 0xC*****;

然后把所有 sys_call_table都替换成 my_sys_call_table
发表于 2004-5-18 19:35:21 | 显示全部楼层
谢谢,我再试试,你那几个*代表什么意思?
发表于 2004-5-18 19:43:13 | 显示全部楼层
麻烦再清楚解释一下:

cd /boot
cat System.map |grep sys_call_table
记住地址-------哪个地址?

然后用 把你的
extern long sys_call_table[];----这是我模块中的吗,在哪里改?
改为
long * my_sys_call_table[];
my_sys_call_table = 0xC*****;----?

然后把所有 sys_call_table都替换成 my_sys_call_table
发表于 2004-5-20 09:23:47 | 显示全部楼层
实践证明是不行的,怎么对一个数组重新赋值呢,他是静态分配的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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