交叉工具链的用途及使用方法

Posted on 2015-02-16 15:32  Bumble_Bee  阅读(2447)  评论(0编辑  收藏  举报

  交叉工具链。链即为集合,交叉工具链也就是交叉工具的集合。平时在电脑上写程序然后再进行编译链接等操作最后生成一个可执行程序,该文件都只能在X86架 构硬件上运行,而不能在我现在使用的开发板,也就是ARM架构上运行。所以进行ARM的裸机程序开发要有一套自己的工具。交叉工具链的安装和环境变量的配置昨天学过了,现在已经忘得差不多了,但是以后会补上的。废话少说,下面开始记录今天学到的东西。
  1、交叉编译器
   顾名思义,就是将写好的C程序代码编译为ARM架构下的可执行文件。以前在电脑上使用的gcc,编译后的可执行文件只能在X86架构下运行,简单的说就是 只能在电脑上运行。用法很简单:“gcc    [options]    源代码名    -o    可执行文件名”。而交叉编译器的用法几乎和它一模一样:“arm-linux-gcc    [options]    源代码名    -o    可执行文件名”。这样生成的可执行程序就可以在我的开发板上运行了。
  2、交叉链接器
   将多个编译后产生的过程文件连接为一个最终的可执行文件。比如写了两个C程序代码,一个.c文件,有main函数,另一个.h文件,没有main函数,现 在要将这两个编译后产生的obj文件链接为最终的可执行文件,就要用到交叉编译器。用法:“arm-lnux-ld  [options]    链接器脚本    -o    文件名.elf    链接所需要的文件.o”。这样就能将多个文件链接成可以在操作系统中运行的可执行文件了。
  3、交叉ELF文件查看器
  用来查看一个可执行文件的相关信息。用法:“arm-linux-readelf    [options]    elf文件名”。比较常用的“arm-linux-readelf    -a    elf” ,可以查看elf文件的运行架构,大小端等信息

   

  像这个图中,是一个可以在小端上运行的elf。
  还有“arm-linux-readelf    -d    elf文件名”,用于显示程序需要的动态链接库。

  

  如图所示,该程序需要libc.so.6这个库。

  4、交叉反汇编器
  将一个可执行文件转换为汇编下的程序。用法:“arm-linux-objdump    -D    -S    elf文件名    >目标文件”,将该文件转为汇编语言并放到目标文件夹中。

  

  如图将转为汇编语言后的代码放入dump这个文件中,然后用vi    dump这个命令即可查看

  

  用/main查找到main函数的位置

  

  如图所示,该图可以看到C语言代码语句与汇编语言语句的对应,这个功能只要在编译该程序时添加“-g”选项(编译过程中带上调试信息)即可实现。
  5、交叉转换器
  将elf格式文件需要的格式。我的理解就是类似于当初学51时将编译后的文件生成为一个hex文件,而在ARM中是生成为bin文件。用法:“arm-linux-objcopy    -O    目标文件格式    原ELF文件    目标文件”。

  

  如图,hello-arm为一个ELF文件,通过交叉转换器使其转为可执行的二进制bin文件。
  上述所有操作都必须在root用户下进行!因为安装交叉工具链时安装在了根目录下的usr里,别的用户无法使用。
  今天早上就学了这么多,记下来方便自己以后忘了来查看。加油!

 

 

 

  ============================分割线============================

 

  第二次看这部分的内容,发现以前的理解还是有些问题的。ELF文件即为linux操作系统中的可执行文件,相当于windows下的exe。他不能运行在裸机中,因为运行它必须要有ELF解析器,显然裸机开发过程是没有这个东西的。裸机只认二进制文件,像我们使用的uboot.bin,所以在我们用gcc编译出ELF文件后,还需要用转换器objcopy将其转换为二进制文件。然而有了linux操作系统的支持,我们就可以直接执行gcc直接编译或者由ld链接生成的可执行文件了。