undefined reference to `__aeabi_uidivmod‘ undefined reference to `__aeabi_uidiv‘ 解决方案

什么时候会遇到
一般是编写arm32裸机程序的时候会遇到这个问题
arm-gcc 默认不会 将 C语言中的除法转换为 SDIV和UDIV指令,而是 将其转化为 __aeabi_idiv 和  __aeabi_uidiv 的调用
编译器 会计算 (9/4) 这样的除法, 然后得出一个 2 返回
如果遇到 变量(不是常量)的除法运算,则会默认转化为 对 __aeabi_idiv 和  __aeabi_uidiv 的调用

如果加了 -mcpu=cortex-a15 , 则会转化为 对SDIV 和 UDIV的调用
如果 同时加了 -mcpu=cortex-a15  -march=armv7-a , 则 会 转化为 对 __aeabi_idiv 和  __aeabi_uidiv 的调用

-mcpu=cortex-a15/-mcpu=cortex-a7 都会 转化为 对SDIV 和 UDIV的调用


解决方案
linux 中 arch/arm/lib/lib1funcs.S 中有该函数的定义
但是引用来引用去,很麻烦,还要包很多头文件

我的方案:
	编译arm32-linux ,得到 arch/arm/lib/.lib1funcs.o.cmd

然后根据其中的 编译选项:
arm-linux-gnueabihf-gcc -Wp,-MD,arch/arm/lib/.lib1funcs.o.d  -nostdinc -isystem /usr/lib/gcc-cross/arm-linux-gnueabihf/9/include -I./arch/arm/include -I./arch/arm/include/generated  -I./include -I./arch/arm/include/uapi -I./arch/arm/include/generated/uapi -I./include/uapi -I./include/generated/uapi -include ./include/linux/kconfig.h -D__KERNEL__ -mlittle-endian -D__ASSEMBLY__ -fno-PIE -mabi=aapcs-linux -mfpu=vfp -marm -Wa,-mno-warn-deprecated -D__LINUX_ARM_ARCH__=7 -march=armv7-a -include asm/unified.h -msoft-float -Wa,-gdwarf-2    -c -o arch/arm/lib/lib1funcs.o arch/arm/lib/lib1funcs.S
将其中的"-c -o arch/arm/lib/lib1funcs.o" 换为 "-E -o arch/arm/lib/lib1funcs.i"

然后在顶层目录跑运行一下 // 注意, 这里面的 -D__LINUX_ARM_ARCH__=7 , 根据你arm32架构版本改变
然后会生成一个 .i 文件 ,将 该 lib1funcs.i 文件 改为 my_lib1funcs.S 文件 ,放到你的工程中编译链接就行了

当然,链接时还会遇到一个新问题, 那就是 div0 未定义,再定义一个 空的 div0 函数就行了
可以为

void __div0(void){
	return 0 ;
}

更加快捷的方式
当你的arm32架构版本 大于等于5,可以用我提供的文件
https://gitee.com/suweishuai/baremetal/blob/master/arch/arm32/lib.S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值