交叉编译工具链有主机和目标机之分。 在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。(原子yocto Poky有两个对应文件)

交叉编译工具链

1、嵌入式开发模型-交叉开发

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

              

在宿主机执行编译的流程如下:

                 

2、交叉编译工具链详解

参考:

http://www.crifan.com/files/doc/docbook/cross_compile/release/html/cross_compile.html

3、制作交叉编译工具

参考:

http://www.crifan.com/files/doc/docbook/crosstool_ng/release/html/crosstool_ng.html

4、交叉编译工具

arm-linux-gcc

arm-linux-addr2line

arm-linux-objcopy

arm-linux-readelf

arm-linux-ar

arm-linux-ld

arm-linux-objdump

arm-linux-size

arm-linux-nm

arm-linux-strip

arm-linux-cc

arm-linux-gprof

arm-linux-c++filt

arm-linux-as

arm-linux-cpp

arm-linux-gccbug

arm-linux-ldd

arm-linux-populate

arm-linux-strings

arm-linux-c++

arm-linux-g++

arm-linux-gcov

arm-linux-ranlib

如何查看各交叉编译工具的帮助信息:

例如查看arm-linux-gcc的帮助信息:

    $ arm-linux-gcc --help

常用的交叉编译工具:

4.1 交叉编译器 arm-linux-gcc

    和X86平台下的gcc的基本用法用法是完全一样的;不同之处:标准的gcc所引用的头文件路径为 /usr/include/stdio.h,arm-linux-gcc所引用的头文件路径为其安装路径下,如 /usr/local/armtools/4.5.1/bin/..

4.2 交叉链接器 arm-linux-ld

    arm-linux-ld命令是ARM平台下的交叉链接器,把程序链接成可以在ARM平台下运行。

    用法: arm-linux-ld -Tled.lds led.o -o led.elf

               把led.o链接成led.elf文件;led.lds是链接器脚本,

4.3 交叉elf文件工具 arm-linux-readelf

查看.elf格式文件: arm-linux-readelf -a led.elf

                          -a 参数是查看.elf文件的所有内容

注意:编译的程序运行不了有两个原因:一个是要看运行平台对不对,第二个是要看处理器的大小端跟编译的程序的大小端是否对应,可以使用arm-linux-readelf -a xxx.elf 命令查看编译出来的程序大小端情况和程序运行平台。

    如下图所示,编译后的程序只能运行在小端(little endian)的处理器上,其运行平台Machine是ARM。绝大多数ARM处理器都是小端的。

   

    查看程序运行平台还可以使用file xxx (xxx为编译后可执行文件) 命令查看。

    如一个应用程序不能执行,排除了运行平台和大小端的情况后,还有可能是库不对。

使用arm-linux-readelf -d xxx (xxx为编译后可执行文件)查看运行库;如hello程序运行库为libc.so.6,如果开发板上没有这个库,程序是运行不了的。

    

4.4 交叉反汇编器 arm-linux-objdump

把hello.c文件编译成hello可执行文件:arm-linux-gcc hello.c -o hello

用法arm-linux -objdump -D -S hello >dump

         把hello可执行文件反汇编后输入保存到dump文件中。

         -D -S 是反汇编参数,>dump 把hello反汇编后的内容保存到dump文件中

      

注意: 在编译hello时没有使用-g参数,反汇编后的代码和原来C代码对应不起来。我们可以在编译hello时使用-g参数:

    先把hello.c文件编译成hello可执行文件:arm-linux-gcc -g hello.c -o hello;运行arm-linux -objdump -D -S hello >dump命令,打开dump文件可以看到

       

4.5文件格式转换器 arm-linux-objcopy

    使用arm-linux-objcopy命令可以把ELF格式的文件转换成二进制文件。

    文件格式转换的原因:elf格式的文件不能直接在ARM上运行(ARM只能运行二进制格式的文件);

    用法:arm-linux-objcopy -O binary led.elf led.bin

            把led.elf格式的文件转换成led.bin二进制文件。

4.6库管理器arm-linux-ar

    arm-elf-ar将多个可重定位的目标模块归档为一个函数库文件。采用函数库文件,应用程序能够从该文件中自动装载要参考的函数模块,同时将应用程序中频繁调用的函数放入函数库文件中,易于应用程序的开发管理。arm-elf-ar支持ELF格式的函数库文件.

交叉编译工具链 - LoTGu - 博客园

一.什么是交叉编译
  什么是交叉编译呢,简单地说,就是在一个平台上生成另一个平台上的可执行代码。
  平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。
 1)“既然我们已经有了主机编译器,那为什么还要交叉编译呢?”
其实答案很简单,没办法啊!有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
 2)“既然可以交叉编译,那还要主机编译干吗?”
其实答案也很简单,交叉编译是不得已而为之!与主机编译相比,交叉编译受的限制更多,虽然在理论上我们可以做任何形式的交叉编译,但事实上,由于受到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下!举例来说,我们至今无法生成惠普公司专有的som格式的可执行文件,因此我们根本无法做目的平台为HPPA-HPUX的交叉编译。
 需要交叉编译的原因有两个:首先,在项目的起始阶段,目的平台尚未建立,因此需要做交叉编译,以生成我们所需要的bootloader(启动引导代码)以及操作系统核心;其次,当目的平台能启动之后,由于目的平台上资源的限制,当我们编译大型程序时,依然可能需要用到交叉编译。

二.背景
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。

三.交叉编译的基础知识

  host 主机平台。
  target 目的平台。
  perfix 交叉编译器的安装位置。
  xxx-xxxx-xxxxx 平台描述。

  我们在主机平台上开发程序,并在这个平台上运行交叉编译器,编译我们的程序;而由交叉编译器生成的程序将在目的平台上运行。这里值得说明得是平台描述,象arm-linux、i386-pc-linux2.4.3这样的字符串我们经常会看到,其实它是用来描述平台的,它有完整格式、缩减格式和别名之分。完整格式是:CPU-制造厂商-操作系统,如sparc-sun-sunos4.1.4,说明平台所使用的CPU是sparc,制造厂商是sun,上面运行的操作系统是SunOS,版本是4.1.4。

四.我需要准备些什么
  怎么说呢,你先得准备好主机平台,其中的区别在于你可能必须做更多的设置工作,当然也有这种可能,就是你所选择的主机平台根本不能生成适用于目标平台的正确的交叉编译器。
  对于交叉编译器,可以自己生成,也可以从网上下载。区别在于从网上下载非常简单方便,但也许你找不到适合你所选择的平台的。
  如果你想自己生成交叉编译器,那你必须先准备下面这些东西
  1、磁盘空间。至少要500M左右的空间,如果想一气呵成的话,那就要900M-1G的空间。
  2、各种源代码。你至少要准备binutils-2.11.2、gcc-2.95.3、linux-2.4.6、newlib-1.8.2或glibc-2.2.2的源代码。


  如果你所使用的主机平台不是运行的linux,那你还必须注意以下这些问题
  1、GNU bash必须是默认shell,所以你也许得把/bin/sh改成bash。
  2、你要确认已经安装了GNU bison,因为这些软经同样使用了bison扩展。
  3、GNU gmake最好是系统默认得make,因为这些软件都使用了gmake扩展,如果不是,在需要make时,记得使用gmake。
  4、如果你想生成交叉glibc,则GNU gsed必须是默认sed,因为glibc会用到gsed的扩展。
  5、如果你想生成交叉glibc,那还必须准备glibc-linuxthreads-2.2.2的源代码。
  6、确认正确的路径搜索顺序,最好让GNU软件首先被执行。

五.怎样生成交叉编译器
  建议使用现成的脚本来生成交叉编译器,因为在配置交叉编译器时,会经常使用一些难以理解的开关项。


要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。
2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。
3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值