【问题标题】:How to Link static or shared library to Kernel Module?如何将静态或共享库链接到内核模块?
【发布时间】:2013-12-27 13:25:19
【问题描述】:

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 

【问题讨论】:

  • 您不能在内核模块中使用库代码。参见例如tldp.org/LDP/lkmpg/2.6/html/index.html.
  • 从某种意义上说,*.ko 文件已经是动态库 - 可以创建按需加载的辅助模块以提供必要的功能(就像使用 crc、加密模块和其他类似的东西一样) )。
  • 感谢您的回复。内核模块甚至不能调用 stdio.h 中的标准 C 函数。我不习惯这种方式。是否可以用boost等libs在cpp中写逻辑代码,然后ko调用逻辑代码?
  • 你的意思是用c++写内核代码?
  • *.ko 文件是可重定位文件,对。我不认为是共享对象文件(动态库)。

标签: c++ c gcc makefile kernel-module


【解决方案1】:

Ko 文件在内核空间中运行,而不是在应用程序运行的用户空间中运行。为用户空间应用准备了libc或libc++等。所以你不能链接 libc/c++ 函数,就像你不能链接内核中的任何 libc 函数一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-09
    相关资源
    最近更新 更多