S5P4418裸机开发(零):小问题记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/M_N_N/article/details/82598349

一、裸机没有除法和取模运算

针对ARM裸机环境,当除数是变量时,报错:

undefined reference to `__aeabi_uidivmod'
undefined reference to `__aeabi_uidiv'

参考:交叉编译之__aeabi_uidiv问题

ARM芯片没有实现除法的硬件结构,因此是采用软件去实现除法。编译器支持软浮点,软浮点的实现是在libgcc.a中。

所以,程序链接时要加上libgcc.a这个静态库;
下面是友善工具链中libgcc.a的路径

LIBPATH     = -L /home/username/ubuntu/bin/4.9.3/lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3 -lgcc

加上后又报了新的错误:

4.9.3/lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/libgcc.a(_dvmd_lnx.o): In function `__aeabi_ldiv0':
/work/toolchain/build/src/gcc-4.9.3/libgcc/config/arm/lib1funcs.S:1331: undefined reference to `raise'

解决undefined reference to `__aeabi_uidivmod’ 提供了一种解决方法;

还一种麻烦点的;
先将libgcc.a中的_dvmd_lnx.o提取出来;

ar x libgcc.a _dvmd_lnx.o

查看_dvmd_lnx.o 的反汇编代码;

arm-linux-objdump -S _dvmd_lnx.o

这里写图片描述
BL raise 改成 NOP,机器码是e1a00000;
然后将.o文件添加进libgcc.a

ar r libgcc.a _dvmd_lnx.o

然后编译链接,还是报上面的错误,我想应该是节表里应该是有raise相关的信息,使用readelf命令打印;
这里写图片描述
我们要做的是将.rel.text段的信息删掉,便试着将它的Size改成0;
将文件用十六进制编辑器打开,搜索98030000(小端),这4个字节紧接着的就是08000000,表示Size,改成00,再打印节表信息;
这里写图片描述
没有显示.rel.text段,再添加进libgcc.a,编译链接,成功;

猜你喜欢

转载自blog.csdn.net/M_N_N/article/details/82598349