简单模块编译问题
向各位请教一个编译内核模块的问题:
我现在有一个交叉编译环境,powerpc-linux-gcc,试验过用它编译一个简单的程序放到ppc平台运行的linux中可以运行。我现在想编译一个最简单的模块文件加载到ppc linux内核中,源文件是很多网上都提过的hello.c,Makefile文件是这样的:
KERNELDIR = /home/davidwx/control-project/daq-module/kernel/linux-2.6.11.8
CROSS_COMPILE = powerpc-linux-
ARCH := ppc
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
CFLAGS = -O2 -D__KERNEL__ -DLINUX -DMODULE -DEXPORT_SYMTAB -O3 -Wall -I$(KERNELDIR) -O
obj-m := hello.o
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
编译总是报这样的错误:
make -C /home/davidwx/control-project/daq-module/kernel/linux-2.6.11.8 M=/home/davidwx/control-project/daq-module/tmp modules
make[1]: Entering directory `/home/davidwx/control-project/daq-module/kernel/linux-2.6.11.8'
CC [M] /home/davidwx/control-project/daq-module/tmp/hello.o
Building modules, stage 2.
MODPOST
CC /home/davidwx/control-project/daq-module/tmp/hello.mod.o
In file included from include/linux/wait.h:27,
from include/asm/semaphore.h:21,
from include/linux/sched.h:19,
from include/linux/module.h:10,
from /home/davidwx/control-project/daq-module/tmp/hello.mod.c:1:
include/asm/current.h:12: error: invalid register name for 'current'
{standard input}: Assembler messages:
{standard input}:3: Warning: setting incorrect section type for .plt
{standard input}:3: Error: alignment not a power of 2
{standard input}:4: Error: alignment not a power of 2
主要是说无效的寄存器名,我查了很多资料都不能解决,希望得到大家的帮助,不甚感激!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
可能是你当前的交叉编译器对这条代码:register struct task_struct *current asm ("r2");识别有问题
不换编译器,怎么让他识别,能改好吗?
解决了的话,共享一下经验,呵呵
不换编译器,就改写代码吧
问题解决了,跟大家分享下经验:
hello.c文件当然是没有问题的了,我的powerpc-linux-gcc编译成功了内核,应该也是没有问题的。
问题还是出在了Makefile 上。我以上的Makefile,基本是根据网络上多数人提到的写的,上次dreamice 看了就觉得有点问题,但是又说不出哪有问题。后来我又比较我同事的Makefile,照他的写了个就行了
KERNEL_SOURCE = /home/davidwx/control-project/daq-module/kernel/linux-2.6.11.8
INCLUDE = $(KERNEL_SOURCE)/include
MODPOST = $(KERNEL_SOURCE)/scripts/mod/modpost
TARGET := hello
CFLAGS = -O2 -Wall -D__KERNEL__ -DMODULE -DKBUILD_MODNAME=$(TARGET)
CFLAGS += -fno-common
$(TARGET).ko: $(TARGET).o $(TARGET).mod.o
powerpc-linux-ld -r $(TARGET).o $(TARGET).mod.o -o $(TARGET).ko
$(TARGET).o:$(TARGET).c
powerpc-linux-gcc -c -I$(INCLUDE) $(CFLAGS) $(TARGET).c
$(TARGET).mod.o:$(TARGET).o
$(MODPOST) $(TARGET).o
powerpc-linux-gcc -c -I$(INCLUDE) $(CFLAGS) $(TARGET).mod.c
我估计obj-m := hello.o,这种写法适合本地编译,而不适合做交叉编译,不知道我的理解对不对,希望大家能积极讨论
[ 本帖最后由 dreamice 于 2009-2-9 17:55 编辑 ]
MODPOST = $(KERNEL_SOURCE)/scripts/mod/modpost
$(TARGET).ko: $(TARGET).o $(TARGET).mod.o
powerpc-linux-ld -r $(TARGET).o $(TARGET).mod.o -o $(TARGET).ko
$(TARGET).o(TARGET).c
powerpc-linux-gcc -c -I$(INCLUDE) $(CFLAGS) $(TARGET).c
$(TARGET).mod.o(TARGET).o
$(MODPOST) $(TARGET).o
powerpc-linux-gcc -c -I$(INCLUDE) $(CFLAGS) $(TARGET).mod.c
最关键的应该是这几句
先恭喜一下,同时感谢分享,呵呵。交叉编译和本地编译还是有差别的。