免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5588 | 回复: 7
打印 上一主题 下一主题

[其他] GCC 4.8.0 编译内核失败 [复制链接]

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-19 07:01 |只看该作者 |倒序浏览

用GCC 4.8.0 优化等级 O2编译驱动, 只要有除法运算就有下面的连接错误:

undefined reference to `__aeabi_uldivmod'
make: *** [.tmp_vmlinux1] Error 1

用GCC 4.8.0 优化等级 O0编译时,由头文件过不了:
include/linux/rcupdate.h: In function '__kfree_rcu':
include/linux/rcupdate.h:808:2: error: size of unnamed array is negative
  BUILD_BUG_ON(!__builtin_constant_p(offset));
  ^
Error 1
试了一些网上的办法,如设置变量为volatile防止优化,设置局部函数优化等级为O0,都去不掉上面的连接错误
不知是否有人遇到同样的问题,谢谢!

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2013-08-19 14:13 |只看该作者
回复 1# linuxfellow
用GCC 4.8.0 优化等级 O2编译驱动, 只要有除法运算就有下面的连接错误:

undefined reference to `__aeabi_uldivmod'
make: *** [.tmp_vmlinux1] Error 1

用GCC 4.8.0 优化等级 O0编译时,由头文件过不了:
include/linux/rcupdate.h: In function '__kfree_rcu':
include/linux/rcupdate.h:808:2: error: size of unnamed array is negative
  BUILD_BUG_ON(!__builtin_constant_p(offset));
  ^
Error 1
试了一些网上的办法,如设置变量为volatile防止优化,设置局部函数优化等级为O0,都去不掉上面的连接错误
不知是否有人遇到同样的问题,谢谢!


什么内核版本?什么平台? 自己修改过的驱动?

   

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
3 [报告]
发表于 2013-08-19 19:47 |只看该作者
回复 2# 瀚海书香
Kernel 3.2.43 , ARM
第一个问题: compile with -O2,错误是由于自己的驱动里用了除法
第二个问题: compile with -O0,错误是由于官方提供的头文件。网上有一些办法如何解决;但我不想动这些官方提供的头文件。kernel用-O0来编译是过不了的;我只是想把自己驱动文件用-O0编译, 但还是避免不了rcu的头文件问题
问题应该出在GCC上,以前我用GCC版本没有这样的问题,gcc或libgcc配置有问题?



   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-08-20 07:20 |只看该作者
回复 3# linuxfellow
Kernel 3.2.43 , ARM
第一个问题: compile with -O2,错误是由于自己的驱动里用了除法
第二个问题: compile with -O0,错误是由于官方提供的头文件。网上有一些办法如何解决;但我不想动这些官方提供的头文件。kernel用-O0来编译是过不了的;我只是想把自己驱动文件用-O0编译, 但还是避免不了rcu的头文件问题
问题应该出在GCC上,以前我用GCC版本没有这样的问题,gcc或libgcc配置有问题?


1.内核中不支持除法,可以通过内核提供的一些类似功能的函数实现

2.默认的内核用-O0应该是可以编译的吧。另外,如果你之前的gcc没有问题的话,那就看看看看这两个版本之间的changelog

   

论坛徽章:
0
5 [报告]
发表于 2013-09-15 16:45 |只看该作者
回复 4# 瀚海书香

整数除法是可以的啊。很多地方都有啊。
   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
6 [报告]
发表于 2013-09-18 16:24 |只看该作者
本帖最后由 arm-linux-gcc 于 2013-09-18 16:30 编辑

估计是编译器的eabi问题吧,整数除法的相关api是在arch/arm/lib/lib1funcs.S中实现的
你用的编译器用了__aeabi_uldivmod,但是内核中没有实现这个api
你可以试试编译一个hello world,也用和你驱动里一样的除法,采用静态链接,加上CFLAGS -mfloat-abi=soft,然后反汇编看看__aeabi_uldivmod是怎么实现的,然后把代码拷贝到过来

我在最新的3.11内核中,发现没有__aeabi_uldivmod这东西,只有__aeabi_uidivmod
或者直接拷贝一份内核中的__aeabi_uidivmod,再把名字改成__aeabi_uldivmod
arm里面unsigned int和unsigned long应该是一样的


或者是你的驱动里面,算除法时定义的变量是ul型的?改成ui型试试呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
7 [报告]
发表于 2013-09-18 22:30 |只看该作者
编译一个用例如下

int main(int argc, char **argv)
{
        unsigned long a, b, c;
        unsigned int d, e, f;

        c = a / b;
        f = d / e;

        return 1;
}


arm-none-linux-gnueabi-gcc -march=armv7-a -mtune=cortex-a9 -mfpu=vfp3 -mfloat-abi=soft div.c -o div-arm-soft

4.6.3的arm-none-linux-gnueabi-gcc编译,反汇编结果如下:
0000842c <main>:
    842c:       e92d4800        push    {fp, lr}
    8430:       e28db004        add     fp, sp, #4
    8434:       e24dd020        sub     sp, sp, #32
    8438:       e50b0020        str     r0, [fp, #-32]  ; 0xffffffe0
    843c:       e50b1024        str     r1, [fp, #-36]  ; 0xffffffdc
    8440:       e51b0008        ldr     r0, [fp, #-8]
    8444:       e51b100c        ldr     r1, [fp, #-12]
    8448:       eb00000a        bl      8478 <__aeabi_uidiv>
    844c:       e1a03000        mov     r3, r0
    8450:       e50b3010        str     r3, [fp, #-16]
    8454:       e51b0014        ldr     r0, [fp, #-20]  ; 0xffffffec
    8458:       e51b1018        ldr     r1, [fp, #-24]  ; 0xffffffe8
    845c:       eb000005        bl      8478 <__aeabi_uidiv>
    8460:       e1a03000        mov     r3, r0
    8464:       e50b301c        str     r3, [fp, #-28]  ; 0xffffffe4
    8468:       e3a03001        mov     r3, #1
    846c:       e1a00003        mov     r0, r3
    8470:       e24bd004        sub     sp, fp, #4
    8474:       e8bd8800        pop     {fp, pc}

可以看到unsigned long和unsigned int的除法,arm-none-linux-gnueabi-gcc都是调的__aeabi_uidiv



我没有4.8的gcc,只能猜测,可能4.8中的unsigned long型的除法是调用的__aeabi_uldiv

所以如果LZ驱动中用的是unsigned long型的话可以尝试改成unsigned int试试
这个问题应该就是4.8的eabi软浮点库对unsigned long和unsigned int型的除法不再一样了,但是内核中又没跟上这种变化,所以导致编译出错

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
8 [报告]
发表于 2013-10-13 10:59 |只看该作者
回复 7# arm-linux-gcc
很抱歉回复有点晚。
你说的很对。 u32没问题,只有我用u64的变量作有关的除法时才有那个错误。改成u32问题就没有了

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP