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

标签 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 并创建目标文件并进行链接以准备一个“模块”.ko 可加载 linux。但是,如果我必须使用特定的库(例如 my_library.a)怎么办:如何防止 Linux makefile 在链接所有目标文件时考虑这个额外的库

   Appendice:

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

干杯, 萨比

最佳答案

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

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

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

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

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

最后,传统的智慧是避免需要大量内核代码。所以你应该考虑有一些辅助用户模式进程。参见 netlink(7) .

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

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

关于linux - 如何构建使用自定义库的外部 linux 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44386866/

相关文章:

linux - 在 Linux 上编译 libtiff 4.0 beta 时遇到问题

erlang - 更改宏时强制 erl -make 重新编译文件

c - 编译时arm丢失了千字节

c++ - 如何在QT中使用pro文件重新编译时执行shell命令?

android - Android是否支持虚拟内存

linux - Linux中有没有类似NanoBSD的东西

linux - 为什么我需要明确地将 pthread 和 rt 与新的 gcc 和 binutils 链接起来?

linux - 是否可以在 linux 中的一系列命令中通过 SSH 从一个终端链接到另一个终端?

c - 在为 sg_copy_buffer 复制内存期间是否需要禁用 IRQ?

linux - 为什么Linux设备驱动中除了init还需要probe方法?