如何构建使用自定义库的外部linux模块

时间:2017-06-06 09:56:34

标签: linux makefile linux-kernel linux-device-driver embedded-linux

我正在尝试使用许多依赖项(例如库)在现有平台中使用下面的行编译外部Linux驱动程序:

    obj-m += mydriver.o
    KDIR ?= $(OUT_DIR)
    default:
       $(MAKE) -C $(KDIR) M=$$PWD
    clean:
       $(MAKE) -C $(KDIR) M=$$PWD clean
    modules:
       $(MAKE) -C $(KDIR) M=$$PWD modules

我注意到这会调用带有创建对象文件的内核Makefile并执行链接以准备一个可以用linux加载的“模块”.ko。但是,如果我必须使用特定的库(例如my_library.a):如何在链接所有目标文件时阻止Linux makefile考虑这个额外的库

   Appendice:

My_library.a是一个c ++源代码,包含访问FPGA寄存器以报告一些有用数据的函数。然后my_driver(因为它是一个C代码源,我必须从my_library.a创建一个C接口)将准备可从用户空间应用程序访问的基本系统调用。最后,my_driver从8kz读取FPGA,感谢my_library.a通过C接口,使数据可读取用户空间APP。

干杯, sahbi

1 个答案:

答案 0 :(得分:0)

最有可能的是,您不能在任何内核模块(或内核代码)中使用应用程序级外部库libmy.amy_library.a。这些库通常构建在C standard library之上(例如,因为它们使用<stdio.h>fprintf<stdlib.h>malloc),这对于内核代码是不存在的。

从概念上讲,内核模块和内核代码是独立式(即不在C标准库之上)。

请注意ABI&amp;调用约定在内核代码和应用程​​序代码中可能不同。当然,内核中可能不存在一些标准函数(如mallocprintfsnprintf ....)。 BTW内核代码不允许使用浮点等...

当然,您可以链接您自己的内核库(来自您自己的内核对象文件),但这通常是不值得的。

(一个不太可能的例外可能是一些不使用任何标准C函数且不使用浮点计算的外部库,但这不会在实践中发生)

最后,传统观点是避免需要大量的内核代码。所以你应该考虑使用一些帮助用户模式进程。请参阅netlink(7)

您可能应该重新设计驱动程序以避免需要任何外部库。由于您只需8KHz读取FPGA,因此您的代码部分可以位于现有系统调用之上的用户区。

请注意,内核代码不能用C ++编写

相关问题