我正在尝试在我的intel x86主机上为ARM体系结构交叉编译helloworld内核(2.6.x)模块。
ARM的代码源工具链位于: / home / ravi / workspace / hawk / arm-2009q3
内核源位于: / home / ravi / workspace / hawk / linux-omapl1
我的Makefile:
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正在调用本机编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。
答案 0 :(得分:34)
将ARCH
和CROSS_COMPILE
放在Makefile中不起作用。您需要将它们放在命令行上:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
答案 1 :(得分:17)
替换
ARCH =臂
CROSS_COMPILE = arm-none-linux-gnueabi
通过
导出ARCH:= arm
export CROSS_COMPILE:= arm-none-linux-gnueabi -
如果您不想每次都提供这些参数命令行,这也会有效。
答案 2 :(得分:6)
旁注:SUBDIRS=
已弃用,取而代之的是M=
。
答案 3 :(得分: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
答案 4 :(得分:0)
在Makefile变量声明的末尾添加export
将使它们可用于子shell。并将短划线添加到CROSS_COMPILE
前缀,JayM指出,M
代替SUBDIRS
,user502515已回答。
并且在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
答案 5 :(得分:-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