交叉编译内核模块

时间:2010-08-12 12:56:59

标签: makefile cross-compiling embedded-linux kernel-module linux-toolchain

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

6 个答案:

答案 0 :(得分:34)

ARCHCROSS_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代替SUBDIRSuser502515已回答。

并且在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