Linux移植之驱动编译出现的问题
2011-07-20 22:56
661 查看
http://johnmcu.blog.163.com/blog/static/17244625620109140555239/
近期搞Linux移植,出现了很多不可预知的问题。后来在师父及其客服的帮助下,完美解决,没辜负我这几天的辛勤努力!我的内核是Linux-2.6.30.4,以EmbedSky_hello.c为例。
我是根据Linux移植手册一步步移植的,以下是我出现的问题:
问题1:在编译驱动模块时出现以下错误提示:
GZIP kernel/config_data.gz
IKCFG kernel/config_data.h
CC kernel/configs.o
make[3]: *** No rule to make target `net/ipv4/netfilter/ipt_ECN.c', needed by `net/ipv4/netfilter/ipt_ECN.o'. Stop.
make[2]: *** [net/ipv4/netfilter] Error 2
make[1]: *** [net/ipv4] Error 2
make: *** [net] Error 2
解决办法:本来移植手册里的选项如下所示:
我们仅需要添加这么多选项就够了,别的全部去除,但是里面有个默认选项不能去除,否则会出现编译内核镜像不成功的情况。
如果不选这个默认选项,编译内核镜像时出现以下问题:
drivers/net/dm9000.c: In function 'dm9000_probe':
drivers/net/dm9000.c:1356: error: 'struct net_device' has no member named 'open'
drivers/net/dm9000.c:1357: error: 'struct net_device' has no member named 'hard_start_xmit'
drivers/net/dm9000.c:1358: error: 'struct net_device' has no member named 'tx_timeout'
drivers/net/dm9000.c:1360: error: 'struct net_device' has no member named 'stop'
drivers/net/dm9000.c:1361: error: 'struct net_device' has no member named 'set_multicast_list'
drivers/net/dm9000.c:1363: error: 'struct net_device' has no member named 'do_ioctl'
make[2]: *** [drivers/net/dm9000.o] Error 1
make[1]: *** [drivers/net] Error 2
make: *** [drivers] Error 2
所以一定要加哦!
现在我用make modules编译驱动,出现以下问题:
make[1]: *** No rule to make target `|', needed by `firmware/dabusb/firmware.fw'. Stop.
make: *** [modules] Error 2
从网上搜了一下,用make M=drivers/char modules编译模块,成功生成.ko文件。那个开心。
问题2:我用insmod EmbedSky_hello.c来加载模块,出现以下问题:
EmbedSky_hello: version magic '2.6.30.4EmbedSky mod_unload ARMv4 ' should be '2.
6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert 'EmbedSky_hello.ko': invalid module format
一看就知道是版本问题,然后make menuconfig进入内核配置,
General setup——>()Local version-append to kernel release,配置成(-EmbedSky)Local version-append to kernel release,就OK啦~
重新编译内核,驱动模块,将EmbedSky_hello.ko放到开发板中,重新加载insmod EmbedSky_hello.ko,又出现问题了:
EmbedSky_hello: Unknown symbol __aeabi_unwind_cpp_pr0
insmod: cannot insert 'EmbedSky_hello.ko': unknown symbol in module, or unknown
parameter
我相当郁闷了,通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是正常的,快崩溃了,最后才知道,是我的开发板里烧的是光盘提供给的镜像,而我自己移植的驱动是在我自己编写的内核里生成.ko文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!
近期搞Linux移植,出现了很多不可预知的问题。后来在师父及其客服的帮助下,完美解决,没辜负我这几天的辛勤努力!我的内核是Linux-2.6.30.4,以EmbedSky_hello.c为例。
我是根据Linux移植手册一步步移植的,以下是我出现的问题:
问题1:在编译驱动模块时出现以下错误提示:
GZIP kernel/config_data.gz
IKCFG kernel/config_data.h
CC kernel/configs.o
make[3]: *** No rule to make target `net/ipv4/netfilter/ipt_ECN.c', needed by `net/ipv4/netfilter/ipt_ECN.o'. Stop.
make[2]: *** [net/ipv4/netfilter] Error 2
make[1]: *** [net/ipv4] Error 2
make: *** [net] Error 2
解决办法:本来移植手册里的选项如下所示:
我们仅需要添加这么多选项就够了,别的全部去除,但是里面有个默认选项不能去除,否则会出现编译内核镜像不成功的情况。
如果不选这个默认选项,编译内核镜像时出现以下问题:
drivers/net/dm9000.c: In function 'dm9000_probe':
drivers/net/dm9000.c:1356: error: 'struct net_device' has no member named 'open'
drivers/net/dm9000.c:1357: error: 'struct net_device' has no member named 'hard_start_xmit'
drivers/net/dm9000.c:1358: error: 'struct net_device' has no member named 'tx_timeout'
drivers/net/dm9000.c:1360: error: 'struct net_device' has no member named 'stop'
drivers/net/dm9000.c:1361: error: 'struct net_device' has no member named 'set_multicast_list'
drivers/net/dm9000.c:1363: error: 'struct net_device' has no member named 'do_ioctl'
make[2]: *** [drivers/net/dm9000.o] Error 1
make[1]: *** [drivers/net] Error 2
make: *** [drivers] Error 2
所以一定要加哦!
现在我用make modules编译驱动,出现以下问题:
make[1]: *** No rule to make target `|', needed by `firmware/dabusb/firmware.fw'. Stop.
make: *** [modules] Error 2
从网上搜了一下,用make M=drivers/char modules编译模块,成功生成.ko文件。那个开心。
问题2:我用insmod EmbedSky_hello.c来加载模块,出现以下问题:
EmbedSky_hello: version magic '2.6.30.4EmbedSky mod_unload ARMv4 ' should be '2.
6.30.4-EmbedSky mod_unload ARMv4 '
insmod: cannot insert 'EmbedSky_hello.ko': invalid module format
一看就知道是版本问题,然后make menuconfig进入内核配置,
General setup——>()Local version-append to kernel release,配置成(-EmbedSky)Local version-append to kernel release,就OK啦~
重新编译内核,驱动模块,将EmbedSky_hello.ko放到开发板中,重新加载insmod EmbedSky_hello.ko,又出现问题了:
EmbedSky_hello: Unknown symbol __aeabi_unwind_cpp_pr0
insmod: cannot insert 'EmbedSky_hello.ko': unknown symbol in module, or unknown
parameter
我相当郁闷了,通过客服,刚开始以为是交叉编译器的问题,可是测试后交叉编译器是正常的,快崩溃了,最后才知道,是我的开发板里烧的是光盘提供给的镜像,而我自己移植的驱动是在我自己编写的内核里生成.ko文件,导致了致命的错误,模块和内核镜像不匹配,后来烧入我自己的内核和文件系统,虽然其中经历了多番波折,总算守得云开见月明了,终于可以加载和卸载模块了!
相关文章推荐
- Linux移植之驱动编译出现的问题
- S3C2440上移植内核之编译Linux2.6.31出现问题
- Linux内核移植过程中出现RTC驱动问题
- 在编写最简单的linux 内核驱动, 编译后出现的问题以及解决方法。
- 将win7下编译好的nutch移植到linux下运行,出现ExcutionException问题
- linux下rtl8188 驱动编译 出现类似 create_proc_entry daemonize 错误问题解决
- 在linux gcc 64位平台编译动态链接库时出现的问题
- ffmpeg android 移植编译出现的问题,求解
- ARM-Linux触摸屏驱动移植--问题总结
- win7C++程序移植到Linux出现的问题
- 【linux 001】【利用staging Driver】【001】wifi AR6000 驱动移植引发的 staging 的问题
- Linux 内核编译,解决网卡驱动缺少的问题,使用更新的内核来完善驱动
- 将linux-2.6.34.13移植到s5pv210 在make时出现的编译器问题
- 路由软件 zebra-0.95a 在linux下面编译出现问题的解决
- Qt程序在linux编译出现[file*** has modification time 3.8e+04s in the furure]问题
- 在移植rt3070驱动的时候编译遇到的问题
- linux 编译busybox出现的一些问题
- ok6410 移植linux-3.11.2出现如下问题????
- 在linux(ubuntu)下编译VLC中出现的问题
- linux驱动移植问题点