0

我试图编译使用许多依赖(如图书馆)现有的平台内与下面的行外部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使用8khz从FPGA读取,这要感谢my_library.a,通过C接口并使用户空间APP可读取数据。

干杯, sahbi

+0

什么*确切*是您的'my_library.a'?请修改您的问题以改进它并具体说明。 –

+0

你的模块到底在做什么?你在开发什么样的驱动程序? –

+0

看起来您正在混合用户空间驱动程序与内核空间驱动程序的概念。 – 0andriy

回答

0

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

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

请注意,ABI &调用约定在内核代码和应用程​​序代码中可能会有所不同。当然,一些标准函数(如malloc,printf,snprintf ....)在内核中可能不存在。 BTW内核代码不允许使用浮点数等等...当然,你可以链接你自己的内核库(在你自己的内核对象文件中),但这往往是不值得的。

(不可思议的例外可能是不使用任何标准的C函数,并且不与浮点计算一些外部库,但不pracice发生)

最后,传统的看法避免需要很多内核代码。所以你应该考虑有一些帮助用户模式的过程。见netlink(7)

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

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