1

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

4

3 回答 3

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. 内核构建系统然后传递给它的不同变量返回到模块目录,所有设置(包括路径、工具链等)以编译模块。这第二次通过 Makefile,采用 kbuild 路径,并像在树中一样构建模块。

于 2012-12-07T08:33:30.363 回答
0

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

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

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

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

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

后一种方法是Angstrom使用的方法,它节省了很多屁股伤害。

于 2012-12-09T14:26:50.553 回答
-3

您可能想尝试使用crosstool-ng

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

这里另一个参考:链接

于 2012-12-07T07:04:26.003 回答