请问如何在宿主机上用交叉编译器编译驱动模块?谢谢!(抱歉我暂时没积分了!!)
我在宿主机上写了一个驱动模块: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还需要改不改哦?
请大家帮忙看看吧!谢谢你们了! 樓主兩次的差別在於換了編譯器,第一次是gcc,第二次是arm-linux-gcc
兩個編譯器的庫文件有差異
建議樓主檢查下demomodule.c中用的函數有無特殊的(也就是arm-linux-gcc不支持的) 我只是想把它编译成二进制文件,所以头文件没变。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()
{
。。。
}
这个程序还需要如何改呀?谢谢了!
回复 #3 pm0115 的帖子
回樓主,沒法改,誰知道你那函數裏都調用啥函數了呀你自己一點點試吧, 先把頭文件都去掉,
int init_module()
void cleanup_module()
放兩個空函數, 如果能編譯過就證明2樓說的正確,然後再在你的兩個函數裏一點點排查吧
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 \
-Wno-trigraphs -Os -mapcs -fno-strict-aliasing -fno-common -fno-common \
-pipe -mapcs-32 -march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float \
LDFLAGS =
all:$(OBJS)
#all:$(EXEC)
$(EXEC):$(OBJS)
$(LD) $(LDFLAGS) -o $ @ $(OBJS)
%.o:%.c
$(CC) $(MODEFLAGS) -c$(SRC)
clean:
-rm -f $(EXEC) *.elf *.o *.gdb
用上面这个makefile 试一下 要是编译还有错误,就把错误信息贴上来!~
[ 本帖最后由 jojolin 于 2008-6-17 17:20 编辑 ] 你那么做不行吧
应该用你的for arm的kernel的src来编译,不应该用你的linux-2.4.20-8的pc的kernel的代码编译 原帖由 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的 LZ解决没有……没解决找我:lol: 非常感谢楼上各位的鼎力相助,在你们的热心帮助下我的问题已经解决了!!可惜我没有分了,只能再次表示感谢!! 你可以找个arm配套的kernel的源代码,然后编译一下,接着再编译你的.c试试
页:
[1]
2