当前位置: 代码迷 >> 驱动开发 >> 关于交叉工具链编译ARM裸机程序出现除法时的有关问题
  详细解决方案

关于交叉工具链编译ARM裸机程序出现除法时的有关问题

热度:33   发布时间:2016-04-28 10:27:33.0
关于交叉工具链编译ARM裸机程序出现除法时的问题
话说用交叉工具链编译裸机时,出现了下面这样的错误。
clock.o: In function `get_PLLCLK':
clock.c:(.text+0x45c): undefined reference to `__aeabi_uidiv'
clock.o: In function `get_ARMCLK':
clock.c:(.text+0x4c0): undefined reference to `__aeabi_uidiv'
clock.o: In function `get_HCLK':
clock.c:(.text+0x570): undefined reference to `__aeabi_uidiv'
clock.o: In function `get_PCLK':
clock.c:(.text+0x608): undefined reference to `__aeabi_uidiv'

我见提示语是跟uidiv除法有关,因为clock.c文件中那几个函数(这些函数是获得系统时钟的)都出现了类似这样的语句:
return (m * (CONFIG_SYS_CLK_FREQ / (p * (1 << s))));
就是都用了除法。
猜测可能是ARM没有除法指令所以除法还得用库函数实现。在网上查了下果然如此,于是就在Makefile里改了编译选项,改后输出结果如下:
CCFLAG is -I ./ -c
LDFLAG is -Bstatic -T my.lds -Ttext 0x0c000000 -nostdlib -L /opt/FriendlyARM/toolschain/4.5.1/ lib/gcc/arm-none-linux-gnueabi/4.5.1 -lgcc

按照网上多数网友的说法,下一步我应该马上遇到个raise标号的问题,我也希望剧情可以这样发展,因为这个raise的问题不难解决。但奇葩的是,我修改库路径和链接选项后,我的问题依然如故,还是显示找不到_aeabi_uidiv,怎么回事?我查看了我机子上交叉工具链里的 libgcc.map文件,发现里面确实有__aeabi_uidiv标号无误。但为毛还是被提示找不到除法呢?


这还可能会是哪儿的问题呢

------解决方案--------------------
引用:
Quote: 引用:

我隐约记得 int i,j; 
。。。。






找到个新的方法,直接全部用arm-linux-gcc,通过-Wl向gcc自身的链接器传递链接选项,没再用arm-linux-ld这个工具。这样试了试倒能成功,下载到板子上可以运行。但总感觉这方法不规范,Uboot里就没这么用。还是想知道ar……


有空就继续试呗
------解决方案--------------------
应该是链接找不到符号,最大的可能是设置的链接库路径不对,使用arm-linux-gcc可以是因为使用arm-linux-gcc系统使用了默认的库,而arm-linux-ld没有自己使用默认的库
------解决方案--------------------
貌似是编译器的问题。。。。。
  相关解决方案