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,它将正常工作。但这不是我想要的。生成文件:
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
aaa.c中有一个函数int myadd(int a,int b){return a + b; },并且使用gcc -c aaa.c -o aaa.o && ar -cr libaaa.a aaa.o和...
Ko文件正在内核空间中运行,而不是在运行应用程序的用户空间中运行。 Libc或libc ++等为用户空间应用程序准备。因此,您无法链接libc / c ++函数,就像无法在内核中链接任何libc函数一样。