首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >驱动/模块交叉编译

驱动/模块交叉编译
EN

Stack Overflow用户
提问于 2012-12-06 12:01:56
回答 3查看 7.4K关注 0票数 1

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

EN

回答 3

Stack Overflow用户

发布于 2012-12-07 08:33:30

下面是一个树外驱动程序的Makefile。指定的体系结构、工具链和内核dir:

代码语言:javascript
复制
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路径,模块就像在树中一样构建。

票数 2
EN

Stack Overflow用户

发布于 2012-12-09 14:26:50

使用构建系统的头进行编译是非常糟糕的消息,并且可能会出现一些微妙的二进制不兼容现象,它们在目标上似乎会出现奇怪的崩溃。

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

内核树是独立的,所以简单地交叉编译就可以了。如果要添加一个驱动程序,那么在树中编译它可能是最简单的。

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

  1. --sysroot=<dir>选项传递给gcc,其中<dir>是目标系统的系统根
  2. 构建gcc和binutils作为它们的默认sysroot

后一种方法是安格斯特罗姆使用的方法,它节省了大量的屁股伤害。

票数 0
EN

Stack Overflow用户

发布于 2012-12-07 07:04:26

您可能想尝试使用交叉凳-ng

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

这里还有另一个参考:链接

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13743226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档