【发布时间】:2010-12-07 20:57:41
【问题描述】:
我正在尝试将 sys 退出调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
但是,当我尝试制作时,控制台给了我错误
error: ‘__NR_exit’ undeclared (first use in this function)
任何提示将不胜感激:) 谢谢
【问题讨论】:
我正在尝试将 sys 退出调用设置为变量
extern void *sys_call_table[];
real_sys_exit = sys_call_table[__NR_exit]
但是,当我尝试制作时,控制台给了我错误
error: ‘__NR_exit’ undeclared (first use in this function)
任何提示将不胜感激:) 谢谢
【问题讨论】:
如果您没有包含文件 syscall.h,您应该在引用 __NR_exit 之前执行此操作。例如,
#include <syscall.h>
#include <stdio.h>
int main()
{
printf("%d\n", __NR_exit);
return 0;
}
返回:
$ cc t.c
$ ./a.out
60
其他一些观察:
#undef 在其他地方删除。
如果您正在为内核空间编写代码,则可以使用一组完全不同的标头。 LXR (http://lxr.linux.no/linux) 可搜索、可浏览的内核源代码存档是一个有用的资源。
【讨论】:
由于您在内核 2.6.x 中,因此 sys_call_table 不再导出。 如果你想避免编译错误,试试这个包含
#include<linux/unistd.h>
但是,它不起作用。因此,“玩”sys_call_table 的解决方法是使用以下命令在 SystemXXXX.map(位于 /boot)中找到 sys_call_table 的地址:
grep sys_call System.map-2.6.X -i
这将给出地址,然后这段代码应该允许您修改表格:
unsigned long *sys_call_table;
sys_call_table = (unsigned long *) simple_strtoul("0xc0318500",NULL,16);
original_mkdir = sys_call_table[__NR_mkdir];
sys_call_table[__NR_mkdir] = mkdir_modificado;
希望它对你有用,我刚刚在内核 2.6.24 下测试过,所以应该适用于 2.6.18
【讨论】:
strtoul?为什么不直接使用文字0xc0318500?此外,这将在可重定位内核上失败。