免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1430 | 回复: 2
打印 上一主题 下一主题

系统调用小实验_困扰 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-08 12:03 |只看该作者 |倒序浏览
本来想实践一下系统调用实验,结果在gcc test.c时出现如下错误:
/tmp/ccGMqetM.o(.text+0x35): In function 'main':
: undefined reference to 'mysyscall'
collect2: ld returned 1 exit status
请高手指点一下: (问题出在第5步以后)

平台:
VMWARE+redhat 9.0 (kernel 2.4.20-8 )

实验目的:
      新建一个简单的系统调用函数mysyscall(),  (没啥功能,就为了体验这个过程)

实验步骤如下:
(1) 添加系统调用号
      在<内核源码目录>/include/asm-i386/unistd.h 和  /usr/include/asm/unistd.h 文件中添加如下内容:
....
#define __NR_mysyscall      259
(2)在系统调用表添加相应表项
<内核源码目录>/arch/i386/kernel/entry.S中,系统调用表后面一行处添加:
...
.long SYMBOL_NAME(sys_mysyscall)
(3) 实现系统调用服务例程
把sys_mysyscall 如下添加在 <内核源码目录>/kernel/sys.c 中
asmlinkage long sys_mysyscall(void)
{
     current->uid=0;
}
(4) 重新编译内核

(5) 编写用户态程序
#include<linux/unistd.h>
int main()
{
      printf("This is my uid: %d \n",getuid());
      syscall(__NR_mysyscall);
      printf("Now, my uid is changed: %d \n",getuid());
}
到这里,gcc test.c
就出现最开始说的问题了!  到底是哪里没对啊?

[ 本帖最后由 wbzhang2594 于 2008-11-8 12:04 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-08 13:16 |只看该作者
你这样不重新编译内核可以吗?
动态加载的话,那至少也得写个 module 啊。

论坛徽章:
0
3 [报告]
发表于 2008-11-08 17:47 |只看该作者
我希望通过编译内核的方式,将这个函数嵌入内核!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP