Makefile 交叉编译内核模块
我正试图在英特尔x86主机上交叉编译一个用于ARM体系结构的helloworld内核(2.6.x)模块 ARM的codesourcery工具链位于:/home/ravi/workspace/hawk/ARM-2009q3 内核源代码位于:/home/ravi/workspace/hawk/linux-omapl1 我的生成文件:Makefile 交叉编译内核模块,makefile,cross-compiling,embedded-linux,kernel-module,linux-toolchain,Makefile,Cross Compiling,Embedded Linux,Kernel Module,Linux Toolchain,我正试图在英特尔x86主机上交叉编译一个用于ARM体系结构的helloworld内核(2.6.x)模块 ARM的codesourcery工具链位于:/home/ravi/workspace/hawk/ARM-2009q3 内核源代码位于:/home/ravi/workspace/hawk/linux-omapl1 我的生成文件: ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi obj-m := Hello.o KDIR := /home/ravi/wo
ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
当我运行make时,生成的.ko是主机的.ko,这意味着makefile调用的是本机编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。将
ARCH
和cross\u COMPILE
放在Makefile中不起作用。您需要将它们放在命令行上:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
旁注:
SUBDIRS=
被弃用,取而代之的是M=
替换
MODULES := hola_kern.o
#guest architecture
ARCH := arm
CROSS_COMPILE := arm-linux-gnueabi-
obj-m := $(MODULES)
#path of the arm compiled kernel
ROOTDIR := /home/aldo/c/proyectos/prefixa/work/kernels/linux-omap-5f0a6e2
MAKEARCH := $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
all: modules
modules:
$(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} modules
clean:
$(MAKEARCH) -C $(ROOTDIR) M=${shell pwd} clean
拱=臂CROSS_COMPILE=arm none linux gnueabi 借 导出拱门:=arm
导出交叉编译:=arm none linux gnueabi-
如果您不想每次都使用这些参数命令行,这也可以使用。您是否可以尝试一下,您忘记将ARCH和CROSS\u COMPILE添加到默认和clean中了
ARCH=arm
COMPILER=arm-none-linux-gnueabi
obj-m := Hello.o
KERNELDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(COMPILER) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) clean
在Makefile变量声明的末尾添加
export
,将使它们可用于子shell。并将破折号添加到所指出的CROSS\u COMPILE
前缀中,并将M
而不是回答的SUBDIRS
一般来说,在Makefile中使用:=
而不是=
是个好主意,因此变量只被插值一次。但在这种特殊情况下,这并不重要
ARCH := arm
CROSS_COMPILE := arm-none-linux-gnueabi-
obj-m := Hello.o
KDIR := /home/ravi/workspace/hawk/linux-omapl1
PWD := $(shell pwd)
export
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
我们可以从
KDIR
中看到Makefile吗?顺便提一下,我们可以不用编写Makefile就编译一个模块,只使用gcc开关吗?我相信你可以,但这并不容易。调用make查看如何调用gcc时,将V=1
添加到命令行中。这就是你必须输入的内容,而不是作为linux noob的make…
。我想知道,如果ARCH和CROSS_COMPILE不能以这种方式工作,为什么它们会出现在一些makefile中。除了命令行,它还可以从命令行或表单导出makefile@itisravi您是否尝试过在不编写makefile的情况下编译模块。i、 这是一个很好的答案,但这里有一个输入错误。KDIR和KERNELDIR必须是同一个变量名。@塞缪尔的评论也适用于$CROSS\u COMPILE
/$CROSS
,我相信您没有使用破折号,您可以使用CROSS\u COMPILE
而不是编译器。