【问题标题】:Driver/module cross compilation驱动/模块交叉编译
【发布时间】:2012-12-06 12:01:56
【问题描述】:

我正在尝试为基于 arm 的板交叉编译驱动程序。在 make 文件中,包含文件的搜索路径是主机内核的路径,即它指向 ubuntu 附带的 linux 头文件。 我在主机系统(i7/ubuntu)上也有目标板的内核源代码树。 我的问题是交叉编译需要哪个包含路径(本机系统的 linux 头文件路径或板的内核源代码树的路径? 是否同样适用于所有模块,包括驱动程序?

【问题讨论】:

  • 它应该指向主板的内核源代码树。这是因为您正在编译的驱动程序的包含文件可能需要基于平台的头文件。例如。如果您为 ARM 进行交叉编译,则包含文件应该指向 arch/arm/include 而不是通用的 linux 包含文件夹。
  • 当我使用板的包含文件时,我得到很多文件丢失的错误。当我使用主机的包含文件(运行 ubuntu 12.04)时没有错误,但驱动程序(模块)以与板不兼容的无效格式编译。在这两种情况下,我都使用供应商提供的工具链中的 arm-linux-gcc 编译器。
  • 当您说“驱动程序以无效格式编译”时,究竟是什么错误?你能详细说明一下吗?如果编译正常,是模块插入过程中显示的错误吗?
  • yes 编译正常。但是当我尝试 insmod 驱动程序的 .ko 文件时,我得到了一个无效的格式错误,将错误粘贴到 insmod: error inserting e1000e.ko: -1 Invalid module format

标签: linux embedded driver


【解决方案1】:

这是一个树外驱动程序的 Makefile。指定的架构、工具链和内核目录:

ifneq ($(KERNELRELEASE),)
# We were called by kbuild

obj-m += fpgacam.o

else  # We were called from command line

KDIR := path/to/your/target/kernel
PWD  := $(shell pwd)
CROSS=arm-none-linux-gnueabi-

default:
    @echo '    Building Cam drivers for 2.6 kernel.'
    @echo '    PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD)  ARCH=arm CROSS_COMPILE=$(CROSS) modules

install:
    ./do_install.sh *.ko

endif  # End kbuild check
######################### Version independent targets ##########################

clean:
    rm -f -r *.o *.ko .*cmd .tmp* core *.i

当从模块目录调用make时,使用命令行路径,并使用make -C将make重定向到内核目录构建系统。内核构建系统然后传递给它的不同变量返回到模块目录,所有设置(包括路径、工具链等)以编译模块。第二次通过 Makefile,采用 kbuild 路径,并像在树中一样构建模块。

【讨论】:

    【解决方案2】:

    使用构建系统的标头进行编译是一个非常糟糕的消息,并且可能会出现微妙的二进制不兼容性,表现为目标上看似奇怪的崩溃。

    正如您已经发现的那样,内核已经对此进行了强化,并且将拒绝加载针对错误标头构建的模块。您需要使用与现有内核相同的源代码树进行构建——包括任何补丁。此时您不妨重建整个内核。

    内核树是自包含的,因此只需在原地交叉编译即可。如果您要添加驱动程序,那么在树中编译它可能是最简单的。

    如果您想构建任何用户空间组件,您有两种解决方案:

    1. --sysroot=<dir> 选项传递给gcc,其中<dir> 是目标系统的系统根目录
    2. 构建 gcc 和 binutils 以用作它们的默认 sysroot

    后一种方法是Angstrom 使用的方法,它可以省去很多麻烦。

    【讨论】:

      【解决方案3】:

      您可能想尝试使用crosstool-ng

      它负责大部分工作。您只需关心要为内核编译启用的配置设置。

      这里是另一个参考:link

      【讨论】:

        猜你喜欢
        • 2011-03-28
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 2014-10-23
        • 2014-01-25
        • 2014-05-01
        • 2014-04-30
        • 2015-09-27
        相关资源
        最近更新 更多