- 论坛徽章:
- 0
|
我觉得我总是找不到一些环节。比如
sysdeps->;generic->;truncate.c中有truncate()的定义
#include <sys/types.h>;
#include <errno.h>;
/* Truncate PATH to LENGTH bytes. */
int
truncate (path, length)
const char *path;
off_t length;
{
__set_errno (ENOSYS);
return -1;
}
我知道truncate是个系统调用,但是就凭这么点代码,怎么就能进入内核的系统调用了?GLIBC在编译的时候做了什么,使得把truncate 转变为 __NR_truncate 放入EAX,然后参数依次进寄存器,再执行INT $80 中断?
GLIBC中Syscall.h基本都是空的,<asm/syscall.h>;中有完整的__NR_xxx的定义,
但是奇怪的是,<asm/syscall.h>;又不是glibc-2.x.x.源码包中自带的!
(在/usr/include/asm/syscall.h中,而不是在内核的/usr/src/linux/...中!)
但是,总要做什么才能把GLIBC基本库中的函数调用,转变为去内核调用吧,这个转变在哪里呢?
看了好久了,在glibc源码和内核源码间切换,都把我切晕了!希望大师们给个提示,任何提示都是好的!谢了! |
|