pm0115 发表于 2008-06-17 14:00

请问如何在宿主机上用交叉编译器编译驱动模块?谢谢!(抱歉我暂时没积分了!!)

我在宿主机上写了一个驱动模块:demomodule.c,里面只有两个函数,就是init_module()和cleanup_module()。并在宿主机下成功编译成了模块:demomodule.o,而且在宿主机下用insmod demomodule.o和remmod demomodule都能成功。但是现在我想把该模块编译成在S3C2410下能使用的模块,我想应该是二进制的格式,所以在makefile文件里面我就做了修改,它和原来的makefile文件区别如下:

原来的makefile文件内容:
compile = gcc -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include -c demomodule.c
demomodule.o:demomodule.c
            $(compile)
经过这个makefile文件make出来的demomodule.o能成功地在宿主机下加载并卸载。但修改后编译都不能通过了,
修改后的如下:
compile = arm-linux-gcc -DMODULE -D__KERNEL__ -DLINUX -I/usr/src/linux-2.4.20-8/include -march=armv4 -c demomodule.c
demomodule.o:demomodule.c
            $(compile)

(注:在宿主机中我装了交叉编译器的,而且可以正常使用,我已经用它编译了其它几个小应用程序并能在开发板上运行了)
这样make后就出现很多错误,不知道是怎么回事?难道是编译的那句语法不对吗?我现在只是想把它编译成二进制文件,和开发板上具体哪个版本无关(我开发板上暂时是2.4.18的),所以不知道是哪里有问题?不晓得原来写的那个demomodule.c还需要改不改哦?

请大家帮忙看看吧!谢谢你们了!

bitmilong 发表于 2008-06-17 14:17

樓主兩次的差別在於換了編譯器,第一次是gcc,第二次是arm-linux-gcc
兩個編譯器的庫文件有差異

建議樓主檢查下demomodule.c中用的函數有無特殊的(也就是arm-linux-gcc不支持的)

pm0115 发表于 2008-06-17 14:42

我只是想把它编译成二进制文件,所以头文件没变。demomodule.c 程序如下:

include <linux/module.h>
include <linux/kernel.h>
include <linux/fs.h>
include <linux/version.h>
include <linux/config.h>
include <linux/init.h>

MODULE_LICENSE("GPL");

int init_module()
{
。。。
}

void cleanup_module()
{
。。。
}

这个程序还需要如何改呀?谢谢了!

bitmilong 发表于 2008-06-17 15:07

回复 #3 pm0115 的帖子

回樓主,沒法改,誰知道你那函數裏都調用啥函數了呀

你自己一點點試吧, 先把頭文件都去掉,
int init_module()
void cleanup_module()
放兩個空函數, 如果能編譯過就證明2樓說的正確,然後再在你的兩個函數裏一點點排查吧

jojolin 发表于 2008-06-17 17:13


EXEC = demomodule
OBJS = demomodule.o
SRC = demomodule.c

INCLUDE = /usr/src/linux-2.4.20-8/include
CC = arm-linux-gcc
LD = arm-linux-ld
MODEFLAGS = -DMODULE -D__KERNEL__ -I$(INCLUDE) -g -Wall -Wstrict-prototypes \
&nbsp;-Wno-trigraphs -Os -mapcs -fno-strict-aliasing -fno-common -fno-common \
&nbsp;-pipe -mapcs-32 -march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float \

LDFLAGS =

all:$(OBJS)
#all:$(EXEC)

$(EXEC):$(OBJS)
&nbsp;&nbsp;&nbsp;&nbsp;$(LD) $(LDFLAGS) -o $ @ $(OBJS)
&nbsp;&nbsp;&nbsp;&nbsp;
%.o:%.c
&nbsp;&nbsp;&nbsp;&nbsp;$(CC) $(MODEFLAGS) -c$(SRC)

clean:
&nbsp;&nbsp;&nbsp;&nbsp;-rm -f $(EXEC) *.elf *.o *.gdb


用上面这个makefile 试一下 要是编译还有错误,就把错误信息贴上来!~

[ 本帖最后由 jojolin 于 2008-6-17 17:20 编辑 ]

T-bagwell 发表于 2008-06-17 17:39

你那么做不行吧
应该用你的for arm的kernel的src来编译,不应该用你的linux-2.4.20-8的pc的kernel的代码编译

jojolin 发表于 2008-06-18 09:18

原帖由 T-bagwell 于 2008-6-17 17:39 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
你那么做不行吧
应该用你的for arm的kernel的src来编译,不应该用你的linux-2.4.20-8的pc的kernel的代码编译



楼上说的正解~ 我都忘了 你可千万别拿红帽自带的内核在那编译arm版本啊......从新下个内核配置成arm的

weijianhua 发表于 2008-06-18 11:06

LZ解决没有……没解决找我:lol:

pm0115 发表于 2008-06-21 11:46

非常感谢楼上各位的鼎力相助,在你们的热心帮助下我的问题已经解决了!!可惜我没有分了,只能再次表示感谢!!

T-bagwell 发表于 2008-06-21 12:32

你可以找个arm配套的kernel的源代码,然后编译一下,接着再编译你的.c试试
页: [1] 2
查看完整版本: 请问如何在宿主机上用交叉编译器编译驱动模块?谢谢!(抱歉我暂时没积分了!!)