【问题】
之前自己用4.2.4和4.2.1版本的arm-linux-gcc 去编译Linux内核代码:
make ARCH=arm
都是正常的,但是后来换了个环境,arm-linux-gcc是3.5的,结果编译kernel出错:
。。。。。。。。。
CC [M] drivers/usb/host/ashost/otgdev_intr.o
CC [M] drivers/usb/host/ashost/otgdev_init.o
drivers/usb/host/ashost/otgdev_init.c: In function `allocEpBuff’:
drivers/usb/host/ashost/otgdev_init.c:79: sorry, unimplemented: inlining failed in call to ‘usb_dev_ep_buff_size’: function body not available
drivers/usb/host/ashost/otgdev_init.c:288: sorry, unimplemented: called from here
make[3]: *** [drivers/usb/host/ashost/otgdev_init.o] Error 1
make[2]: *** [drivers/usb/host] Error 2
make[1]: *** [drivers/usb] Error 2
make: *** [drivers] Error 2
【解决过程】
去看了下代码,发现是drivers/usb/host/ashost/otgdev_init.c中的
/* allocate memory for each endpoint */
void allocEpBuff(int epNum)
{
。。。。
/* Allocate data buffers for each EP */
usb_device.endp[epNum]->data_buffer
= dma_alloc_coherent(
NULL,
usb_dev_ep_buff_size(epNum),
&usb_device.endp[epNum]->data_buff_addr, GFP_KERNEL
);
/* debugging */
debg(("ep%1d data_buff=%x ", epNum, (int)usb_device.endp[epNum]->data_buffer));
。。。。
}
而usb_dev_ep_buff_size是在drivers/usb/host/ashost/otgdev_ops.c中:
/* Function to return a buffer size, for a particular EP Minor Num */
int __inline__ usb_dev_ep_buff_size(int ep_num)
{
。。。
return 0;
}
开始,自己的想法和网上某位的一样,以为inline函数的作用域只是当前C文件,而不能被别人C文件调用。
但是,看了
http://hi.baidu.com/serial_story/blog/item/d9f4c2fa9abf11d4b58f31bf.html
后,发现上面的inline,是可以被外部所引用的,也就是说,上面的代码,是可以正常编译的。
但是为何会编译出错?还不完全清楚。
然后又去网上找了其他类似的问题,发现,其他也有很多人遇到此问题,
基本都是用了3.4.X的gcc去编译代码,结果对于inline不支持外部引用。
而我此处是3.5的gcc编译出错,而4.2.X的gcc编译正常。
所以,基本可以断定:
【结论】
是之前旧版本的gcc(比如3.4,3.5)对于inline支持不好,有bug,不支持外部引用inline函数,所以编译会出错,而新版本的gcc(比如4.2.X)解决了这个bug,可以正常编译了。
【解决办法】
将编译器gcc升级至新版本的,比如我此处的4.2.1或4.2.4之类的,再重新编译,就可以了。
转载请注明:在路上 » 【已解决】unimplemented: inlining failed in call to XXX function body not available