如何使用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))
是否有关于如何在设备驱动程序中进行静态编译的示例包?
我知道 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))