【问题标题】:How to statically build kernel module with buildroot?如何使用 buildroot 静态构建内核模块?
【发布时间】:2016-04-29 13:57:23
【问题描述】:

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

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

【问题讨论】:

  • 您的驱动程序有问题。编译时初始化顺序可能是错误的。而且您似乎没有做功课,即检查如何在内核文档中调试 initcalls。
  • 我已经完全正常工作了,我将通过一个示例来回答我自己的问题。
  • 动态外部内核模块:stackoverflow.com/questions/40307328/…

标签: linux-kernel driver buildroot


【解决方案1】:

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

配置文件

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))

【讨论】:

  • 我会提供一个.patch 文件并应用它。
【解决方案2】:

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

【讨论】:

  • 我会提供一个例子,我已经解决了我自己的问题。您在技术上是正确的,但承认我的意思是我有驱动程序代码并且我希望它静态链接到内核中可能更有好处,因为我知道比认为 .ko 文件可以静态链接到vmlinux 文件。
猜你喜欢
  • 2019-05-18
  • 2011-05-22
  • 2018-10-28
  • 2019-10-13
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
相关资源
最近更新 更多