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