如何将静态或共享库链接到内核模块?

3

aaa.c中有一个函数

  int myadd(int a, int b){ 
        return a+b;
  }

aaa.c被编译成了静态库,使用以下命令:

gcc -c aaa.c -o aaa.o && ar -cr libaaa.a aaa.o

或者编译成动态库,使用以下命令:

gcc -c aaa.c -o aaa.o && gcc -shared -fPCI -o libaaa.so aaa.o

然后我写了一个名为call.c的文件,并尝试在libaaa.so中调用函数myadd(),但失败了。

请给我一些建议。

test.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("Dual BSD/GPL");
extern int myadd(int a, int b);
static int hello_init(void)
{
    int c = 0;
    printk(KERN_ALERT "hello,I am Destiny\n");
    c = myadd(1, 2);
    printk(KERN_ALERT "res is (%d)\n", c);
    return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "goodbye,kernel\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_AUTHOR("Destiny");
MODULE_DESCRIPTION("This is a simple example!\n");
MODULE_ALIAS("A simplest example");

这个Makefile将两个c文件编译成call.ko,虽然可以工作,但这不是我想要的。 Makefile:

KVERSION = $(shell uname -r)

obj-m       = call.o
call-objs   = aaa.o test.o

Debug:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

All:Debug

cleanDebug:
    make -C /lib/modules/$(KVERSION)/build M=/home/Destiny/myProject/kernel/cbtest/ clean

clean:cleanDebug

installDebug:Debug
    rmmod /lib/modules/2.6.18-348.12.1.el5/test/call.ko
    /bin/cp call.ko /lib/modules/$(KVERSION)/test/
    depmod -a
    insmod /lib/modules/2.6.18-348.12.1.el5/test/call.ko

install:installDebug

main.o : defs.h 

1
你不能在内核模块中使用库代码。请参见例如http://www.tldp.org/LDP/lkmpg/2.6/html/index.html。 - user2845360
在某种意义上,*.ko文件已经是动态库了 - 可以创建辅助模块按需加载以提供必要的功能(就像crc、crypto模块和其他类似的东西一样)。 - oakad
你的意思是用C++编写内核代码吗? - moeCake
我的意思是使用C++编写逻辑代码,将逻辑代码编译成C兼容的静态或动态库;内核模块加载库,并调用逻辑函数。 - xj107359
1
*.ko文件是可重定位文件,对吧。我认为它们不是共享对象文件(动态库)。 - Shukant Pal
显示剩余2条评论
1个回答

1

Ko文件在内核空间运行,而不是应用程序运行的用户空间。Libc或libc++等库是为用户空间应用程序准备的。因此,您无法链接libc/c++函数,就像您无法在内核中链接任何libc函数一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接