我正试图交叉编译一个基于arm的板的驱动程序。在make文件中,包含文件的搜索路径是主机内核的路径,即指向ubuntu附带的linux头。我还在主机系统(i7/ubuntu)上显示了目标板的内核源代码树。我的问题是,交叉编译(本机系统的linux头路径还是板的内核源代码树的路径)需要哪种路径?同样的情况是否适用于所有模块,包括驱动程序?
发布于 2012-12-07 08:33:30
下面是一个树外驱动程序的Makefile。指定的体系结构、工具链和内核dir:
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路径,模块就像在树中一样构建。
发布于 2012-12-09 14:26:50
使用构建系统的头进行编译是非常糟糕的消息,并且可能会出现一些微妙的二进制不兼容现象,它们在目标上似乎会出现奇怪的崩溃。
正如您已经发现的,内核已经对此进行了强化,并将拒绝加载针对错误标头构建的模块。您需要使用与现有内核相同的源代码树进行构建--包括任何补丁。此时您最好重新构建整个内核。
内核树是独立的,所以简单地交叉编译就可以了。如果要添加一个驱动程序,那么在树中编译它可能是最简单的。
如果要构建任何用户空间组件,则有两种解决方案:
--sysroot=<dir>选项传递给gcc,其中<dir>是目标系统的系统根sysroot后一种方法是安格斯特罗姆使用的方法,它节省了大量的屁股伤害。
发布于 2012-12-07 07:04:26
https://stackoverflow.com/questions/13743226
复制相似问题