【问题】
编译完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.
对应地我这里此处的代码是:
在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
知道的加我QQ教下我
QQ:784141072
谢谢
(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)