我正在尝试为基于arm的电路板交叉编译驱动程序。在make文件中,包含文件的搜索路径是主机内核的搜索路径,即它指向ubuntu附带的linux头文件。 我还在主机系统(i7 / ubuntu)上有目标板的内核源代码树。 我的问题是交叉编译需要哪些包含路径(本机系统的linux头路径或者内核源代码树的路径? 同样的事情适用于包括驱动程序在内的所有模块吗?
答案 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)
使用构建系统的头文件进行编译是一个非常糟糕的新闻,并且可能会出现微妙的二进制不兼容性,这些不兼容性表现为目标上看似奇怪的崩溃。
正如您已经发现的那样,内核已经针对此进行了强化,并且将拒绝加载针对错误标头构建的模块。您需要使用与现有内核相同的源代码树构建 - 包括任何修补程序。此时您也可以重建整个内核。
内核树是自包含的,因此只需对其进行交叉编译即可。如果你要添加一个驱动程序,最简单的就是在树中编译它。
如果您想构建任何用户空间组件,您有两个解决方案:
--sysroot=<dir>
选项传递给gcc
,其中<dir>
是目标系统的系统根目录sysroot
后一种方法是Angstrom使用的方法,它可以节省大量的屁股伤害。
答案 2 :(得分:-3)