- 论坛徽章:
- 0
|
本来想实践一下系统调用实验,结果在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>
//_syscall0(long,mysyscall)
int main()
{
printf("This is my uid: %d \n",getuid());
//mysyscall();
syscall(__NR_mysyscall);
printf("Now, my uid is changed: %d \n",getuid());
}
到这里,gcc test.c
就出现最开始说的问题了!
如果用//注释行的方法,则是下面的错误:
/tmp/......(.text+0x1c):In function 'mysyscall':
: undefined reference to 'errno'
collect2: ld returned 1 exit status
请高手帮忙解答一下是什么意思, 还有到底是哪里没对?
[ 本帖最后由 wbzhang2594 于 2008-11-8 19:08 编辑 ] |
|