如何使用buildroot静态构建内核模块?

How to statically build kernel module with buildroot?

是否有关于如何在设备驱动程序中进行静态编译的示例包?

我知道 obj-y 与 obj-m 相比用于静态编译。我现在在我的 buildroot 包中构建了一个可动态加载的模块。该动态模块完全按照我的预期工作。我什至发现我可以更改模块 makefile 以使用 obj-y,并添加一个 buildroot 选项,如果我单击它,它会在 drivers/Makefile 中追加一行。输出似乎表明我的模块已构建。但是在我看来,我的驱动程序的 init 函数根本没有在启动时执行,因为我在 /dev 中没有看到我的设备文件。

无法使用内核静态 link 外部模块。为此,您必须修补内核本身并在那里添加您的模块。

假设您在 driver.c 中有一个驱动程序和一个名为 STATICDRVR 的 buildroot 包,您可以使用以下 Config.in 和 STATICDRVR.mk 文件来添加静态模块构建内核时构建:

Config.in

config BR2_PACKAGE_STATICDRVR
       bool "Build & link static driver?"
       help
         This is a driver that blah blah greatness whatever

STATICDRVR.mk

STATICDRVR_VERSION = master
STATICDRVR_SITE =  /location/to/STATICDRVR_containing_src
STATICDRVR_SITE_METHOD = local
STATICDRVR_MODULE_SUBDIRS = src
STATICDRVR_INSTALL_TARGET = YES
STATICDRVR_LICENSE = GPLv2
STATICDRVR_LICENSE_FILES = COPYING
STATICDRVR_NAME = STATICDRVR

STATICDRVR_DEPENDENCIES = linux


define STATICDRVR_BUILD_CMDS
    #make sure that obj-y += STATICDRVR/ is only in the build makefile once
    sed -i '/obj-y += STATICDRVR/d' $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
    echo "obj-y += STATICDRVR/" >> $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
    rm -rf $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
    cp -r $(@D)/src $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
    echo "obj-y += driver.o" > $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR/Makefile
endef

define STATICDRVR_INSTALL_STAGING_CMDS
endef


define STATICDRVR_INSTALL_TARGET_CMDS
endef

endif

define STATICDRVR_DEVICES
endef

define STATICDRVR_PERMISSIONS
endef

define STATICDRVR_USERS
endef

$(eval $(kernel-module))
$(eval $(generic-package))