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

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

 

 

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

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

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

http://bbs.csdn.net/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自带的连接工具还是有点查别的,抽时间研究一下。

 

 

你可能感兴趣的:(【GCC-ARM裸机开发随笔】----之解决链接标准库的问题)