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

NewThinker_wei 2012-12-16 11:11:43
话说用交叉工具链编译裸机时,出现了下面这样的错误。
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标号无误。但为毛还是被提示找不到除法呢?


这还可能会是哪儿的问题呢
...全文
976 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主哥哥,请问,遇到了raise问题应该怎么解决呢?你说“不难解决”。我也在网上找了,但是都是在编译uboot时才会遇到,而我是在编译裸机程序的时候。真烦心啊,一个星期都没头绪.....
gpmn 2013-06-26
  • 打赏
  • 举报
回复
__aeabi_uidiv在libgcc.a里面, ld这个.a就OK了
Anhelus 2013-04-20
  • 打赏
  • 举报
回复
请问LZ现在清楚是什么原因了吗,我最近也遇到这个问题,困扰了我蛮久的。
zgwstar 2013-01-03
  • 打赏
  • 举报
回复
貌似是编译器的问题。。。。。
NewThinker_wei 2012-12-19
  • 打赏
  • 举报
回复
引用 7 楼 yanjun_su 的回复:
应该是链接找不到符号,最大的可能是设置的链接库路径不对,使用arm-linux-gcc可以是因为使用arm-linux-gcc系统使用了默认的库,而arm-linux-ld没有自己使用默认的库
刚发现这个问题我也这么想的,不过我试过故意将库路径写错,那样的话make的时候就会提示找不到库。但我的路径确实是对的,我是先找到那个库文件,然后pwd,把路径复制到Makefile中的。所以真不好再说会是路径的问题
yanjun_su 2012-12-18
  • 打赏
  • 举报
回复
应该是链接找不到符号,最大的可能是设置的链接库路径不对,使用arm-linux-gcc可以是因为使用arm-linux-gcc系统使用了默认的库,而arm-linux-ld没有自己使用默认的库
nadleeh 2012-12-18
  • 打赏
  • 举报
回复
引用 5 楼 NewThinker_wei 的回复:
[quote=引用 4 楼 nadleeh123 的回复:] 我隐约记得 int i,j; 。。。。 找到个新的方法,直接全部用arm-linux-gcc,通过-Wl向gcc自身的链接器传递链接选项,没再用arm-linux-ld这个工具。这样试了试倒能成功,下载到板子上可以运行。但总感觉这方法不规范,Uboot里就没这么用。还是想知道ar……
有空就继续试呗
NewThinker_wei 2012-12-17
  • 打赏
  • 举报
回复
[quote=引用 4 楼 nadleeh123 的回复:] 我隐约记得 int i,j; 。。。。 找到个新的方法,直接全部用arm-linux-gcc,通过-Wl向gcc自身的链接器传递链接选项,没再用arm-linux-ld这个工具。这样试了试倒能成功,下载到板子上可以运行。但总感觉这方法不规范,Uboot里就没这么用。还是想知道arm-linux-ld怎么用。 你说的常量问题,应该只有两个都是常量时才能通过,这时候编译器直接把数算出来。
nadleeh 2012-12-17
  • 打赏
  • 举报
回复
我隐约记得 int i,j; . . . . i/j这样会报未定义的引用,但是只要i和j其中有一个是常量就不汇报
nadleeh 2012-12-17
  • 打赏
  • 举报
回复
引用 2 楼 NewThinker_wei 的回复:
引用 1 楼 nadleeh123 的回复: arm没除法指令 你得自己实现 我知道ARM没除法指令,但编译器本身肯定带库的,这些库函数应该就在libgcc里面实现。问题我这里链接老出问题,编译uboot时就直接通过。
那看看uboot呗,我当初是自己实现了4位数的除法。
NewThinker_wei 2012-12-17
  • 打赏
  • 举报
回复
引用 1 楼 nadleeh123 的回复:
arm没除法指令 你得自己实现
我知道ARM没除法指令,但编译器本身肯定带库的,这些库函数应该就在libgcc里面实现。问题我这里链接老出问题,编译uboot时就直接通过。
nadleeh 2012-12-17
  • 打赏
  • 举报
回复
arm没除法指令 你得自己实现

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧