016交叉工具链

1、什么是交叉工具链:

  从两个层次理解,第一个层次,交叉工具,第二个层次,链;

  链是集合的意思,合并到一起,交叉工具链就是一系列交叉工具的集合;

2、嵌入式开发模型——交叉开发

  在嵌入式开发里面,有一种非常重要的模型叫交叉开发模型;

  在这个模型中,有宿主机,目标机(开发板),宿主机和目标机的硬件平台是不一样的,宿主机一般都是X86平台,目标机有ARM等,X86很少,如果在宿主机上面编译程序,仅仅编译在x86平台上使用,显然放到目标机上面就运行不了了,那么就必须编译出在目标机上面运行的程序,但是宿主机又是x86平台,所以就会存在一种在x86平台上产生出一种用于其他硬件平台上面运行的程序,这种开发模式就叫做交叉开发模式;

  在嵌入式开发中,有宿主机和目标机的角色之分:宿主机是执行编译,链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。

3、常用交叉工具:

  (1)交叉编译器:arm-linux-gcc

  gcc是从/usr/include中寻找头文件的,arm-linux-gcc可以用参数-print-serach-dirs查看;

  (2)交叉链接器:arm-linux-ld

  从一个编辑好的程序到一个可以运行的程序,经过了编译和链接;

  ld就是完成链接的作用,链接成能够在ARM平台上运行的程序;

  范例:arm-linux-gcc -g -c led.S

     arm-linux-ld -Tled.lds -o led.elf led.o

     首先是工具的名字,然后如果要用到链接器脚本,使用-T指明链接器脚本,使用-o指明链接之后程序的名字,最后指明这个程序是由哪些中间文件链接而成的;

  (3)交叉转换器:arm-linux-objcopy

  链接出来的程序都是elf格式的,这种格式的文件不能直接在ARM处理器上运行,在开发板上的Linux系统上运行时,首先会由Linux系统所带的elf解析器把它解析成二进制文件,然后再去运行的,在ARM处理器或其他处理器上能够运行的程序一定是二进制格式的程序;

  怎么把elf格式的文件转换成二进制文件呢?

  由arm-linux-objcopy来做:

  范例:arm-linux-objcopy -O binary led.elf led.bin

    -O指明输出的格式   然后跟上输入文件和输出文件的名字

    bin文件能在ARM处理器上直接运行的,因为烧写到nand flash中,并没有Linux系统的支持,就没有人去帮你把elf转换成二进制,所以要在烧写之前用objcopy转换成二进制,才能在ARM处理器上运行;

  

  (4)交叉ELF文件工具:arm-linux-readelf

    不管是arm-linux-gcc直接编译链接出来的程序,还是通过arm-linux-ld间接链接出来的程序,最终得到的程序都是elf格式;

    arm-linux-readelf -a led.elf可以查看elf文件的信息;

    

    

    用arm-linux-gcc编译一个程序:arm-linux-gcc hello.c -o hello

    把这个应用程序放到开发板上去运行,运行不了,可能的情况:第一,应用程序根本就不是运行在ARM平台上的,怎么检查?可以使用命令file hello,

    

    第二,大小端不对,可以使用arm-linux-readelf -a led.elf查看大小端对不对;ARM一般是小端模式;

    还有一种情况就是库信息不对,一个应用程序是要用到一些库的,在你的开发板上有没有这些库?就得去检查了!

    可以使用:arm-linux-readelf -d hello,查看需要哪些库;

    

    

  (5)交叉反汇编器arm-linux-objdump

    反汇编器在底层的开发中是非常有用的工具,当我们编写一个程序放到开发板上运行,效果不是自己想要的,就可以去查看汇编代码,看是不是在汇编一级出现了错误。

    范例:arm-linux-objdump -D -S hello ->dump(将信息输出到dump文件中)

       让输出的信息变得简单点:

        arm-linux-gcc -g hello.c -o hello  

        然后再进行反汇编:arm-linux-objdump -D -S ->dump 

        可以在vim中查找main()函数,做比较!

   

    加上--help可以查看用法!

    我们关注的只是最后的名字ld/gcc,前面的arm是指明平台,后面的是本质!

  

转载于:https://www.cnblogs.com/mch0dm1n/p/5506483.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值