最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】WARNING:Section mismatch, while compiling done of Linux kernel

工作和技术 crifan 2681浏览 0评论

【问题】

编译完Linux内核后,出现:

WARNING: drivers/usb/host/as352xhcd.o(.text+0x2be0): Section mismatch: reference to .init.text:otgHostInit (between ‘otgGlobalInit’ and ‘otgInit’)

【解决过程】

网上有人说的比较清楚了:

这是因为在一些没有使用__Init 或者 __devinit 标示的函数中调用了有这些标示的函数。

Don’t call functions marked with __init or __devinit from inside functions not marked with these special keywords.

参见:http://fixunix.com/embedded/521200-warning-section-mismatch-while-compiling-fedora-2-6-21-1-3194-fc7kernel.html

对应地我这里此处的代码是:

在otgGlobalInit()和otgInit()之间,找到代码

void otgGlobalInit(void)
{

/* initialize host */
otgHostInit();

}

而otgHostInit是__init类型的函数:

int __init otgHostInit(void)
{

}

也就是说,对于不是__init的类型的函数,去调用__init类型的函数,是不安全的,所以要提出警告。因为,__init和__devinit都是只有Linux内核初始化会调用到这些函数,而内核初始化后,就会释放这些函数所占用的内存,也就是说,这些函数在系统初始化后,就不存在了,因此普通的函数不能调用__init类型的函数。

【解决办法】

1.如果那个__init的函数后来还可能被调用,那么就将改__init函数的__init去掉,变成普通函数即可。此处即,将int __init otgHostInit(void),改为int otgHostInit(void)即可。

2.如果调用__init的函数的那个主调函数也是初始化之后就不用了,那么直接将其改为__init类型的也可。此处即,如果void otgGlobalInit(void),只是初始化用到,以后就不用了,那么将void otgGlobalInit(void)改为void __init otgGlobalInit(void)即可。

总的来说,在允许的情况下,第二种处理方法更好,用完就释放,可以节省宝贵的内存。

转载请注明:在路上 » 【已解决】WARNING:Section mismatch, while compiling done of Linux kernel

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (3)

  1. 能不能告诉我段是什么意思,我做redhat5里面的DNS服务。Warning: ID mismatch: expected ID 53822,got8343
      知道的加我QQ教下我
    QQ:784141072
    谢谢 
    hu001qun14年前 (2011-03-07)回复
  2. Warning: ID mismatch: expected ID 53822,got8343
    hu001qun14年前 (2011-03-07)回复
  3. Hi,

    (sorry I don't speak chinese)

    I'm looking for Linux code for AS352x / AS353x for writing rockbox ports (www.rockbox.org)

    Can you share your Linux code with me ? It is impossible to find it on the web!

    Thanks! Please use my email if you're OK (rafael.carre at gmail.com)
    funman15年前 (2010-02-08)回复
82 queries in 0.184 seconds, using 22.13MB memory