水木社区手机版
首页
|版面-嵌入式系统(Embedded)|
新版wap站已上线
返回
1/1
|
转到
主题:[求助]编译器翻译%运算的规则是什么?
楼主
|
sxmman
|
2022-04-07 21:02:47
|
只看此ID
背景:编译arm平台上的uboot,可以正常编译,反汇编查看运算符%对应的语句,为__aeabi_uidivmod,看前缀应该是编译链工具自带库中的函数?
之后,在makefile文件中,手动添加编译参数-DDEBUG,编译报错,在某个包含%的assert语句中,提示undefined reference __aeabi_ldivmod。因为打开了debug选项,所以该assert宏生效, 会进行编译。
为什么添加debug后,编译器翻译运算符会出现差异呢?
在哪个地方制定编译器对运算符的处理呢?
网上搜索类似错误,国外一个网站上说的解决办法,是把源码中某__aeabi_uldivmod符号改为__aeabi_ldivmod,然后加入到编译对象中。。。。
编译链版本:gcc version 7.2.1 20171011 (Linaro GCC 7.2-2017.11-rc1)
谢啦,哪位兄指点下吧。
--
FROM 111.183.25.*
1楼
|
jesce
|
2022-04-08 13:03:23
|
只看此ID
uidivmod是uint32, ldivmod是long long (64位), 所以就是库里缺少64位的__aeabi_l
divmod函数. u-boot有对应的patch:
http://patchwork.ozlabs.org/project/uboot/patch/1457317732-18406-3-git-send-
email-sjg@chromium.org/
我感觉, 反正这是debug里才出现, 如果这数值不太可能到64位, 直接转换为32位做%就
完了
ps: 你的编译器后面带了个RC1, 这是非正式版, 用在嵌入式系统不太靠谱吧?
【 在 sxmman 的大作中提到: 】
: 背景:编译arm平台上的uboot,可以正常编译,反汇编查看运算符%对应的语句,为__aeabi_uidivmod,看前缀应该是编译链工具自带库中的函数?
: 之后,在makefile文件中,手动添加编译参数-DDEBUG,编译报错,在某个包含%的assert语句中,提示undefined reference __aeabi_ldivmod。因为打开了debug选项,所以该assert宏生效, 会进行编译。
: 为什么添加debug后,编译器翻译运算符会出现差异呢?
: ...................
--
FROM 113.116.30.*
2楼
|
sxmman
|
2022-04-08 15:46:01
|
只看此ID
谢啦,是这个原因,不过这个patch很老,是实现uldivmod的,我用的2019.01版本已经合并这个修改了。
我已经手动加入了ldivmid符号,然后反汇编发现只有一处调用了这个符号,应该是这个版本uboot还没有修正这个bug。下次更新到最新版本算了。
【 在 jesce 的大作中提到: 】
: uidivmod是uint32, ldivmod是long long (64位), 所以就是库里缺少64位的__aeabi_l
: divmod函数. u-boot有对应的patch:
:
http://patchwork.ozlabs.org/project/uboot/patch/1457317732-18406-3-git-send-
: ...................
--
FROM 111.181.49.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版