【发布时间】:2011-12-04 02:57:00
【问题描述】:
我正在尝试通过修改系统调用表来挂钩 Linux 3.x 内核上的 sys_execve() 函数。问题是sys_execve() 仅在执行不成功时才应该返回错误代码。使用我正在使用的包装函数(见下文),当在有效的可执行文件上调用 sys_execve() 时,它执行良好并且一切正常。但是,当在不存在的文件或其他导致错误情况的文件上调用它时,调用程序将崩溃:
segfault at 3b ip 000000000000003b...
使用strace 检查挂钩sys_execve() 的返回值显示-1 或ENOSYS 而不是正确的错误代码,这让我感到困惑,因为我检查了我的包装函数的程序集以及sys_execve() 的 Linux 源代码。关于为什么我的包装器没有正确传递错误代码的任何建议?
asmlinkage long new_execve(const char* name, const char const** argv, const char const** envp, struct pt_regs* regs) {
return orig_func(name, argv, envp, regs);
}
【问题讨论】:
-
这可能不相关,但我有兴趣替换 linux >3 中的系统调用。你能给我提供一些相关的信息吗?
标签: c operating-system linux-kernel exec