Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4723
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-30 13:57
文章分类
文章存档

2014年(2)

我的朋友
最近访客

分类: LINUX

2014-10-21 16:07:06

 

关于LD和GCC作为链接器的不同


最近捣鼓Cotex ARM,一直使用arm gcc来作为编译器,然后使用make系统,加上openocd烧写调试。之前的项目的工程很简单,是直接自己定义寄存器头文件来操作的,不过这次项目庞大,涉及usb,为了加快开发速度,准备使用一些三方库了,开始看了st的标准库(我用的stm32),不过实在是不习惯也不喜欢st的库,代码风格不喜欢,然后非常之庞大,对gcc支持可以说很差,对于这个资源比较吃紧的项目简直不可想象,MCD的程序员貌似喜欢MFC,里面经常使用大写的宏用在函数返回处,我这个习惯了linux内核代码风格的人看了很感冒,索性就把希望寄托于libopenstm32上面了,这个库比较精简(当然了,也不够完善,但是简单就是王道!),然后下载下来编译,之前的Makefile做了修改,不过后面因为usb的相关操作里使用了string库的memcpy函数等,导致后面编译通不过,我在想,为什么libopenstm32要c库的东西呢?不过又想,为什么不能用呢?很早之前捣鼓过bootloader知道C库的东西是不敢奢望的,printf得自己整一个,不过回头想libopenstm32的能够编译通过的啊,看了很久(哎,很惭愧,有两天时间都要琢磨下这个事情),没看出来给$(LD)的参数跟我的有什么不同啊,
到今天下午还是 error: undefined reference to 'memcpy'............

后来还是仔细看了看人家的Makefile(没办法,要活命就得努力了!),结果发现LD = $(PREFIX)-gcc, gcc ? ??? 不是 LD ?哇! 终于明白了!

其实LD是binutils工具集的底层部件,所以会工作在汇编级别,所以说呢,如果要让它能找到东西自然要给指明了,也就是说你指到工具链目录的的libc.a上面去再 -lc才可以找到C库里的函数,不过这个就麻烦了,我一会cygwin一会linux的,arm gcc安装目录又不一样,这叫人情何以堪呢 ??

-------------->
    Unswer: GCC做链接器了,也就是说叫GCC 又 -c 又 link的,gcc知道c库在哪里,怎么链接的。
所以该 LD 为 GCC 问题得到解决!




一阵E文过来,没见error,哎,不容易啊!

Compiling libopenstm32 ...
make -C lib/libopenstm32
make[1]: Entering directory `C:/Workspace/Tools/Cygwin/home/Administrator/usbPrinter/virtualPrinterPrj/lib/libopenstm32'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `C:/Workspace/Tools/Cygwin/home/Administrator/usbPrinter/virtualPrinterPrj/lib/libopenstm32'
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -O0 -Wall -ffunction-sections -c -I ./include/   -I ./include/libopenstm32 main/main.c -o main/main.o
arm-none-eabi-gcc -Wl,--gc-sections -Wl,-Map=virtualPrinter.Map -nostartfiles -mcpu=cortex-m3 -mthumb   -Wl,-T lib/libopenstm32/STM32F103.ld   -L lib/libopenstm32 main/main.o -lopenstm32 -o virtualPrinter.elf
arm-none-eabi-objcopy -Obinary virtualPrinter.elf virtualPrinter.bin
arm-none-eabi-objdump -D virtualPrinter.elf > virtualPrinter-DS.lst

===============================================================
Target Size   (Decimal Mode):
===============================================================
   text       data        bss        dec        hex    filename
   7068         20        304       7392       1ce0    virtualPrinter.elf

[Compilation is Done!]

文后附件是我的stm32 demo工程,供网友参考使用.
文件:stm32-gcc-openocd-demo.tar.bz2
大小:135KB
下载:下载
阅读(539) | 评论(0) | 转发(0) |
0

上一篇:Linux启动过程详解

下一篇:没有了

给主人留下些什么吧!~~