如何解决这个编译错误

时间:2014-04-25 18:52:00

标签: c kernel freebsd kernel-module

尝试一些FreeBSD内核黑客攻击,我在一个简单的钩子示例中遇到了错误。代码如下

*注意 - 我添加了#include <sys/stat.h>许多建议,但仍然会出现同样的错误。

#include <sys/types.h>
#include <sys/param.h>
#include <sys/proc.h>
#include <sys/module.h>
#include <sys/sysent.h>
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/syscall.h>
#include <sys/sysproto.h>
#include <sys/stat.h>

static int mkdir_hook(struct thread *td, void *syscall_args) {

  struct mkdir_args *uap;
  uap = (struct mkdir_args *)syscall_args;
  char path[255];
  size_t done;
  int error;
  error = copyinstr(uap->path, path, 255, &done);
  if(error != 0)
    return (error);

  uprintf("hooked it\n");
  return (mkdir(td, syscall_args));
}

static int load(struct module *module, int cmd, void *arg) {
  int error = 0;
  switch(cmd){
  case MOD_LOAD:
    sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir_hook;
    break;
  case MOD_UNLOAD:
    sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir;
    break;
  default:
    error = EOPNOTSUPP;
    break;
  }
  return(error);
}

static moduledata_t mkdir_hook_mod = {
  "mkdir_hook",
  load,
  NULL
};

DECLARE_MODULE(mkdir_hook, mkdir_hook_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);

编译器错误是

    mkdirhook.c:23:11: error: implicit declaration of function 'mkdir' is invalid in C99 [-Werror,-Wimplicit-function-declaration]
  return (mkdir(td, syscall_args));
          ^
1 error generated.
*** Error code 1

我的猜测是这是一个简单的问题,我使用的代码示例已经过时了。

4 个答案:

答案 0 :(得分:5)

您不能在内核模块中使用mkdir

mkdir函数是标准C库(libc)的一部分,它只能在用户空间程序中使用,而不能在内核或模块代码中使用!< / p>

因此mkdirsys/stat.h的定义位于#ifndef _KERNEL/#endif区块中,并且不会被视为&#34;&#34;&#34;&#34;如果你正在编译内核模块。

2011年,所有系统调用都被赋予了sys_前缀。 (另请参阅this question的答案)因此,您应该使用sys_mkdir

答案 1 :(得分:2)

mkdir()在FreeBSD上的sys / stat.h中定义。代码需要:

  #include <sys/stat.h>

答案 2 :(得分:1)

您需要包含sys / stat.h才能使用mkdir函数。

#include <sys/stat.h>

答案 3 :(得分:1)

implicit declaration of function 'mkdir'是赠品......您正在尝试使用尚未制作原型的函数(mkdir())。 原型:#include <sys/stat.h>