免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7663 | 回复: 12
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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还需要改不改哦?

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

论坛徽章:
0
2 [报告]
发表于 2008-06-17 14:17 |只看该作者
樓主兩次的差別在於換了編譯器,第一次是gcc,第二次是arm-linux-gcc
兩個編譯器的庫文件有差異

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

论坛徽章:
0
3 [报告]
发表于 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()
{
。。。
}

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

论坛徽章:
0
4 [报告]
发表于 2008-06-17 15:07 |只看该作者

回复 #3 pm0115 的帖子

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

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

论坛徽章:
0
5 [报告]
发表于 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 编辑 ]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
6 [报告]
发表于 2008-06-17 17:39 |只看该作者
你那么做不行吧
应该用你的for arm的kernel的src来编译,不应该用你的linux-2.4.20-8的pc的kernel的代码编译

论坛徽章:
0
7 [报告]
发表于 2008-06-18 09:18 |只看该作者
原帖由 T-bagwell 于 2008-6-17 17:39 发表
你那么做不行吧
应该用你的for arm的kernel的src来编译,不应该用你的linux-2.4.20-8的pc的kernel的代码编译




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

论坛徽章:
0
8 [报告]
发表于 2008-06-18 11:06 |只看该作者
LZ解决没有……没解决找我

论坛徽章:
0
9 [报告]
发表于 2008-06-21 11:46 |只看该作者
非常感谢楼上各位的鼎力相助,在你们的热心帮助下我的问题已经解决了!!可惜我没有分了,只能再次表示感谢!!

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
10 [报告]
发表于 2008-06-21 12:32 |只看该作者
你可以找个arm配套的kernel的源代码,然后编译一下,接着再编译你的.c试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP