简单模块编译问题

发布于 2022-09-23 15:03:00 字数 2109 浏览 10 评论 0

向各位请教一个编译内核模块的问题:
我现在有一个交叉编译环境,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

别闹i 2022-09-30 15:03:00

可能是你当前的交叉编译器对这条代码:register struct task_struct *current asm ("r2");识别有问题

一腔孤↑勇 2022-09-30 15:03:00

不换编译器,怎么让他识别,能改好吗?

下壹個目標 2022-09-30 15:03:00

解决了的话,共享一下经验,呵呵

_蜘蛛 2022-09-30 15:03:00

不换编译器,就改写代码吧

韶华倾负 2022-09-30 15:03:00

问题解决了,跟大家分享下经验:
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 编辑 ]

柳絮泡泡 2022-09-30 15:03:00

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

最关键的应该是这几句

雅心素梦 2022-09-30 15:03:00

先恭喜一下,同时感谢分享,呵呵。交叉编译和本地编译还是有差别的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文