跨编译内核模块

33

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

ARM的codesourcery工具链位于:/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正在调用本地编译器而不是交叉编译器。我做错了什么?交叉编译器的二进制文件在我的路径中。


我们可以看到来自KDIR的Makefile吗? - Beta
6个回答

35

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

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

3
顺便提一下,我们是否可以通过使用gcc开关而无需编写makefile来编译模块? - itisravi
2
我相信你可以做到,但这并不容易。在调用make时,在命令行中添加“V=1”,以查看gcc的调用方式。这就是你需要键入的内容,而不是“make ...”。 - JayM
3
作为一个对Linux不太熟悉的人,我想知道为什么在一些Makefiles中会出现ARCH和CROSS_COMPILE,如果它们并不起作用的话。 - Patric
不必使用命令行,也可以从命令行或makefile中导出。 - Jagdish
@itisravi 你尝试过使用gcc编译模块而不编写makefile吗? - GShaik
@AbdulGafoor 不,据我所知,kbuild 只能与 makefile 一起使用。 - itisravi

20

替换

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

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

这样做还可以避免每次都要在命令行中输入这些参数。


7

顺便提一下:SUBDIRS=已经过时了,现在应该使用M=


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

这是一个很好的答案,但这里有一个打字错误。KDIR和KERNELDIR需要使用相同的变量名。 - Samuel
我认为Samuel的评论也适用于$CROSS_COMPILE/$CROSS - Janus Troelsen
你错过了破折号,可以使用CROSS_COMPILE代替COMPILER - 0andriy

1
在你的Makefile变量声明末尾添加export将使它们可用于子shell。如JayM所指出的那样,在CROSS_COMPILE前缀中加入破折号,并使用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

-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接