什么时候会遇到
一般是编写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"
然后在顶层目录跑运行一下
然后会生成一个 .i 文件 ,将 该 lib1funcs.i 文件 改为 my_lib1funcs.S 文件 ,放到你的工程中编译链接就行了
当然,链接时还会遇到一个新问题, 那就是 div0 未定义,再定义一个 空的 div0 函数就行了
可以为
void __div0(void){
return 0 ;
}
更加快捷的方式
当你的arm32架构版本 大于等于5时,可以用我提供的文件
https: