如何构建使用自定义库的外部 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通过 C 接口通过 my_library.a 从 FPGA 读取 8khz,并使数据可读以供用户空间 APP 使用。

干杯 萨赫比

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

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

请注意,ABI 和调用约定在内核代码和应用程序代码中可能有所不同。当然,一些标准函数(如mallocprintfsnprintf......)可能不存在于内核中。顺便说一句,内核代码不允许使用浮点等...

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

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

最后,传统智慧是避免需要大量内核代码。因此,您应该考虑使用一些帮助程序用户模式进程。参见网联(7)。

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

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