33

我正在尝试在我的 intel x86 主机上为 ARM 架构交叉编译一个 helloworld 内核(2.6.x)模块。

ARM 的 codesourcery 工具链位于:/home/ravi/workspace/hawk/arm-2009q3

内核源代码位于:/home/ravi/workspace/hawk/linux-opl1

我的制作文件:

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 是我的主机的,这意味着 makefile 正在调用本机编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。

4

6 回答 6

35

ARCHandCROSS_COMPILE放入 Makefile 不起作用。您需要将它们放在命令行上:

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
于 2010-08-12T20:16:58.693 回答
20

代替

ARCH=arm
CROSS_COMPILE=arm-none-linux-gnueabi

经过

出口 ARCH:=arm
出口 CROSS_COMPILE:=arm-none-linux-gnueabi-

如果您不想每次都提供这些参数命令行,这也将起作用。

于 2013-01-22T11:21:08.373 回答
7

旁注:SUBDIRS=不赞成使用M=.

于 2010-11-21T13:49:17.740 回答
5

你能试试吗,你忘了把 ARCH 和 CROSS_COMPILE 添加到默认和干净

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
于 2014-07-08T22:33:48.657 回答
1

在 Makefile 变量声明的末尾添加export将使它们可用于子 shell。并将破折号添加到JayM指出的CROSS_COMPILE前缀中,而不是user502515回答的那样。MSUBDIRS

并且通常使用:=而不是=在 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
于 2017-07-15T15:19:44.713 回答
-1
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
于 2012-04-01T05:28:53.640 回答