【GCC-ARM裸机开发随笔】----之解决链接标准库的问题

本文记录了在Linux环境下使用交叉工具链开发ARM裸机程序时遇到的除法问题及解决过程。通过调整链接选项、自定义Makefile隐规则等手段,最终采用特定链接方式成功实现目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随笔中记录的是笔者在Linux环境中用交叉工具链开发ARM裸机程序时遇到的一些问题和解决方法,主要是将解决问题的过程和一些小经验、小技巧记录下来。现在把一些感觉有点价值的内容搬到博客中供读者参考。

 

 

-----------------12.16-----------------

22:25
使用交叉工具链编译裸机程序需要用到除法时老出错。后来将交叉工具链中的库libgcc.a用-L 和 -l 添加到了链接选项中,但还是不行,错误依旧。错误提示是:undefined reference to `__aeabi_uidiv'。

后来发了个帖子询问,参见这里:

http://bbs.youkuaiyun.com/topics/390318464?page=1#post-393232299

 

-----------------12.17-----------------

18:00
针对昨天的问题新建了个test工程专门测试除法的问题。测试过程中发现我昨天没有自定义Makefile的隐规则,而系统默认的隐规则编译时并不使用我定义的CCFLAG。有点进展,但修改之后,发现错误依旧。后来将昨天找到libgcc库的目录中其他以libgcc开头的库也添进连接选项中,发现还是不行。

测试过程中发现,当我使用两个int型整数进行除法运算时,会提示__aeabi_idiv找不到;使用两个uint型进行除法时,提示__aeabi_uidiv。因此猜想 _idiv 指int型div,而 _uidiv则指unsigned int 型的div。__aeabi暂不清楚代表什么。

18:20
诶!貌似有点进展了!昨天把libm加入链接选项发现不管用,可能是昨天没有重写Makefile隐规则的原因,因为那意味着除了我自己写了start.o的生成规则外,对于其他用Makefile默认隐规则创建的.o文件,我定义的CCFLAG没用上。现在把 libm 库重新加入连接选项后,终于见到raise了。具体如下:
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so: undefined reference to`raise@GLIBC_2.4'
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so: undefined reference to`__errno_location@GLIBC_2.4'
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so: undefined reference to`fwrite@GLIBC_2.4'
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so: undefined reference to`_rtld_global_ro@GLIBC_PRIVATE'
/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so: undefined reference to`sprintf@GLIBC_2.4'
后面还有,不写了。不过看样子还不是很对,因为我发现前面还有警告:
arm-linux-ld: warning: ld-linux.so.3, needed by /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so, not found (try using -rpath or -rpath-link)
arm-linux-ld: warning: libc.so.6, needed by /opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/libm.so, not found (try using -rpath or -rpath-link)
start.o: In function `_start':
(.text+0x0): undefined reference to `__aeabi_uidiv'
这里提到我加入的libm库可能还要用到ld-linux.so.3和libc.so.6,这些不是系统下才有的吗?我要写的是裸机阿!还有,我是静态链接,但这里却出现了.so库,晕。而且我汇编里的__aeabi_uidiv依然未被识别!


23:02
各种试都不行,LD真让人但疼。不过找到一种新法,算是可以用了,LED灯可以闪。这种方法是直接使用arm-linux-gcc本身自带的链接工具,而没有使用arm-linux-ld。
$(CC)  -v -static -Wl,-T,my.lds,-Ttext,0x50000000,-Map,$(NAME).map -nostartfiles -o $(NAME).elf $(OBJ)
$(OBJCOPY) -O binary $(NAME).elf $(NAME).bin    #接着将boot.elf->boot.bin

这样就行。关于arm-linux-gcc,
# -v 显示编译链接的详细过程
#-static 静态链接
#-Wl,-Tubl_davinci.lds,-Map,system.map 这些参数传给链接器(以逗号分割,不是空格)
#-nostartfiles 告诉gcc不要加入启动文件。

参考:http://blog.chinaunix.net/uid-2282111-id-2113244.html

看来arm-linux-ld跟arm-linux-gcc自带的连接工具还是有点查别的,抽时间研究一下。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值