Makefile 交叉编译内核模块

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

我正试图在英特尔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/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
而不是
编译器。