-
28-09-2019 - |
题
我正在尝试在我的 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 正在调用本机编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。
解决方案
把ARCH
和CROSS_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
不隶属于 StackOverflow