驱动程序/模块交叉编译

时间:2012-12-06 12:01:56

标签: linux embedded driver

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

3 个答案:

答案 0 :(得分:2)

这是一个用于树外驱动程序的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路径,并且模块就像它在树中一样构建。

答案 1 :(得分:0)

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

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

内核树是自包含的,因此只需对其进行交叉编译即可。如果你要添加一个驱动程序,最简单的就是在树中编译它。

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

  1. --sysroot=<dir>选项传递给gcc,其中<dir>是目标系统的系统根目录
  2. 构建gcc和binutils以用作默认sysroot
  3. 后一种方法是Angstrom使用的方法,它可以节省大量的屁股伤害。

答案 2 :(得分:-3)

您可能想尝试使用crosstool-ng

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

这里有另一个参考:link