Chinaunix首页 | 论坛 | 博客
  • 博客访问: 562963
  • 博文数量: 192
  • 博客积分: 3780
  • 博客等级: 中校
  • 技术积分: 1487
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-26 10:11
文章存档

2012年(6)

2011年(160)

2010年(26)

分类: 嵌入式

2011-05-05 22:12:49


基于mini2440的hello简单编译出错问题

drivers/media/radio/radio-maestro.c: In function 'radio_function':
drivers/media/radio/radio-maestro.c:235: error: invalid type argument of '->' (have 'long unsigned int')
make[3]: *** [drivers/media/radio/radio-maestro.o] Error 1
make[2]: *** [drivers/media/radio] Error 2
make[1]: *** [drivers/media] Error 2
make: *** [drivers] Error 2

去除部分 Device Drivers  --->

          Multimedia devices  --->

          Radio Adapters  --->

          < > Maestro on board radio

          < > D-Link USB FM radio support (EXPERIMENTAL)



drivers/mmc/wbsd.c:2048: error: storage size of `wbsd_driver' isn't known
make[2]: *** [drivers/mmc/wbsd.o] 错误 1
make[1]: *** [drivers/mmc] 错误 2
make: *** [drivers] 错误 2


去除部分 Device Drivers  --->

          MMC/SD Card support  --->

             < >   Winbond W83L51xD SD/MMC Card Interface support


编译完上述的hello版本完之后,通过ftp下载到mini2440板子上,但当插入该模块是出错了,如下:

qq2440_hello_module: version magic '2.6.13 ARMv4 gcc-3.4' should be '2.6.13 pree mpt ARMv4 gcc-3.4'

原因是:preempt ARMv4 gcc-3.4 是内核认为的当前版本,而编译出来的模块的版本是'2.6.13 ARMv4 gcc-3.4‘,这样内核和要加载的模块版本不一致,内核拒绝加载这个模块。



问题解决了,是由于在配置内核的时候没有选择preemptable这项,选上之后可以正确加载模块,即少了preempt,进行如下修改,即可:

Code maturity level options  --->

    [*] Prompt for development and/or incomplete code/drivers

    [*]   Select only drivers expected to compile cleanly

 实际上进行上述修改之后,增加了

Loadable module support  --->

 [ ]   Module versioning support (EXPERIMENTAL)

帮助:

 Symbol: MODVERSIONS [=n]                                  
  Prompt: Module versioning support (EXPERIMENTAL)                      
    Defined at init/Kconfig:444                                          
    Depends on: MODULES && EXPERIMENTAL                                          Location:                                                                     -> Loadable module support                                             

    -> Enable loadable module support (MODULES [=y]) 

也增加了:

Kernel Features  ---> 

  [*] Preemptible Kernel (EXPERIMENTAL)

在这里主要把这个选上就可以:查看vim include/linux/vermagic.h  得知

#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else

然后,搜索PREEMPT即可,找到[*] Preemptible Kernel (EXPERIMENTAL)选项,打开。


即MODVERSIONS配置,所以就会出现preempt 的 version magic 了。请参考另一篇文章对versino magic 的检查说明:

http://blogold.chinaunix.net/u3/118340/showart_2537265.html

 

[root@FriendlyARM plg]# insmod qq2440_hello_module.ko
insmod: cannot insert `qq2440_hello_module.ko': File exists (-1): File exists
[root@FriendlyARM plg]#
[root@FriendlyARM plg]# rmmod qq2440_hello_module.ko
Good-bye, QQ2440 module was removed!
[root@FriendlyARM plg]# insmod qq2440_hello_module.ko
Hello, QQ2440 module is installed !

网址:http://blog.csdn.net/linwhwylb/archive/2010/09/05/5864200.aspx

http://blogold.chinaunix.net/u2/70445/showart_1271808.html

 

3.稍微更改一下Makefile:
每个内核的名字都包含了他的版本号,这也是 uname -r 命令显示的值。内核Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile
经过了修改,以生成一个和运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的
Makefile。
例如,假如 uname -r 返回字符串2.6.18-1.2798.fc6,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2798.fc6
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 18
也就是最后一个连字符后面的任何内容。
4.配置及编译内核。 
进入/usr/src/2.6.18-1.2798.fc6-i586/目录下,能够看到Makefile文档,他包含了整个内核树编译信息。该文档最上面四行是关于内核版本的信息。对于整个Makefile能够不用做修改,采用默认的就能够了。 
一般情况下,需要先用命令诸如"make menuconfig", "make xconfig"或"make oldcofig"对内核进行配置,这几个都是对内核进行配置的命令,只是他们运行的环境不相同,执行一下这几个命令中的任何一个即可对内核进行配置: make menuconfig是基于界面的内核配置方法,make xconfig应该是基于QT库的,更有make gcofig也是基于图像的配置方法,应该是需要GTK的环境,make oldcofig就是对内核树原有的.config文档进行配置一下即可。 
其实内核的配置部分,主要是确保内核启动模块可动态加载的配置,默认配置里面应该已包含了这样的内容,因此,我用的是make menuconfig. 
注意:
您的内核必须已启用这些选项进行了编译,用以支持模块的动态加载。
(用make menuconfig调出内核配置菜单):
Loadable module support --->

  •  Enable loadable module support
  •  Module unloading
    [ ] Module versioning support (EXPERIMENTAL)
  •  Automatic kernel module loading
    注:该步没做时,在make modules时将出错。
    Kernel Feautre -> Preemptible Kernel

  • 注:该项为内核抢占式调度配置, 必须确保在构建运行的内核和编译环境的内核时都选上,一般PC机运行的内核已选上了,否则在insmod时将出现如下错误:
    # insmod st7565p_driver26.ko
    Using st7565p_driver26.ko
    st7565p_driver26: version magic '2.6.14.7 ARMv4 gcc-3.4' should be '2.6.14.7 preempt ARMv4 
    gcc-3.4'
    insmod: cannot insert `st7565p_driver26.ko': Invalid module format (-1): Exec format error



  • 阅读(1186) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~