使用自定义系统调用时未定义的引用错误

时间:2015-03-19 04:31:58

标签: c kernel system-calls

我正在尝试在内核3.19中导入新的系统调用。我按照here给出了教程!

这是我通过系统调用实现因子计算的简单代码。

 #include <linux/kernel.h>


 asmlinkage long sys_fact(int a)
 {
    int n;
    int c;
    for(n = 1;n <= a;n++)
    c = c * n;  
    printk(KERN_INFO "Factorial calculated!\n");


    return((long) c);
 }

当我尝试编译C代码时,我收到了对sys_fact错误的未定义引用。 我正在使用此系统调用的程序如下。

#include <stdio.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <unistd.h>

int main()
{
  int n;
  printf("Enter a number to calculate it's factorial\n");
  scanf("%d", &n);
  printf("Factorial of %d = %d\n", n, sys_fact(9));

  return 0;
}

我的系统是64位ubuntu 14.04,我根据我的系统按照上面提到的教程。

另外,我在安装内核时已经结合了以下命令,我认为这是安装内核时没有出错的原因。

 make && make modules_install && make install

内核安装花了2-3个小时,现在我很沮丧。 请帮忙!!

我对syscall_64.tbl进行了编辑(最后四个条目)。

 320    common  kexec_file_load     sys_kexec_file_load
 321    common  bpf                 sys_bpf
 322    64      execveat            stub_execveat
 323    common  fact                sys_fact

2 个答案:

答案 0 :(得分:2)

原因是虽然您可能正在使用新内核运行,但#include标头和C库仍然是旧的,因此他们对您新添加的系统调用一无所知。所以你不能指望定义sys_fact。

正如@SantoshA所建议的那样,网站http://linuxseekernel.blogspot.in/2014/07/adding-system-call-in-x86-qemu.html建议将syscall()函数与系统调用号一起使用。

答案 1 :(得分:1)

您的新syscall没有libc api,请尝试使用syscall(323, args ...)调用它,如教程中所示。

只是检查你是否已经使用新内核启动了?您可以按照安装步骤here进行操作。或者使用像Qemu这样的模拟器可能更容易,因此您不必重新启动。