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

时间:2016-01-22 20:46:00

标签: linux-kernel driver buildroot

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

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

2 个答案:

答案 0 :(得分:2)

假设您在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))

答案 1 :(得分:1)

无法将外部模块与内核静态链接。为此,您必须修补内核并在那里添加模块。