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

ARM 的代码源工具链位于: /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

当我跑步时 制作, ,生成的 .ko 是我的主机的,这意味着 makefile 正在调用本机编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。

有帮助吗?

解决方案

ARCHCROSS_COMPILE在Makefile不起作用。你需要把他们在命令行上:

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

其他提示

替换

  

ARCH =手臂,点击   CROSS_COMPILE =臂-NONE-Linux的gnueabi

通过

  

出口ARCH:=手臂,点击   出口CROSS_COMPILE:=臂-NONE-Linux的gnueabi -

这也将工作,如果你不希望每次给这些参数的命令行。

旁注:SUBDIRS=以有利于M=的弃用

你能不能试试,你忘了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

添加 export 在 Makefile 变量声明的末尾将使它们可用于子 shell。并将破折号添加到 CROSS_COMPILE 前缀为 杰姆 指出,并且 M 代替 SUBDIRS 作为 用户502515 回答道。

一般来说,使用是一个好主意 := 而不是 = 在 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
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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top