精华内容
参与话题
问答
  • 交叉编译器

    2011-10-11 10:15:52
    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。 这里需要注意...

      在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。

    这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。

    同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。

    举例来说,我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称;而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。

                                                                                                                                                                                                                      

    有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;

    有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;

    有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。

                                                                                                                                                                                                                      


      交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在Windows平台上,可使用Visual C++开发环境,编写程序并编译成可执行程序。这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为native compilation,中文可理解为本机编译

      然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的CPU运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序。

                                                                                                                                                                                                                      


      要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(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的可执行代码。


    转载:http://baike.baidu.com/view/1795991.htm


    展开全文
  • arm-linux-gcc交叉编译器7.2.1,适用 ARM -A9 等ARMV7-32的硬件,在Linaro官网下载,这里分数没办法设置为0
  • 64位Linux的ARM交叉编译器

    热门讨论 2013-08-22 15:25:08
    以前将android的kernel拿出来单独编译,交叉编译器也是从android代码中拿出来的。 但自从装了Ubuntu 12.04 64位系统之后,原来在32位系统上可以使用的arm-linux交叉编译器不能用了。 按照网上的方法安装 sudo apt-...
  • 交叉编译

    2020-11-17 21:42:09
    1.什么是交叉编译 编译:是在一个平台上生成该平台上的可执行代码。 交叉编译是在一个平台上生成另一个平台上的可执行代码。 比如: <1> C51的交叉编译的发生在keil(集成环境上面) <2> 我们在...

    1.什么是交叉编译

    • 编译:是在一个平台上生成该平台上的可执行代码。
    • 交叉编译是在一个平台上生成另一个平台上的可执行代码。

    比如:
    <1> C51的交叉编译的发生在keil(集成环境上面)
    <2> 我们在windows上面编写C51的代码,并编译成可执行代码,如:xxx.hex,是在C51上面运行,不是在windows上面运行
    <3> 我们在ubuntu上面编写树莓派的代码,并编译成可执行代码,如:a.out,是在树莓派上面运行,不是在ubuntu Linux上面运行

    2.为什么要用交叉编译?

    平台上不允许或不能安装我们所需要的编译器,如:C51
    <1> 因为目的平台上的资源贫乏,无法运行我们所需要的编译器
    <2> 树莓派是不是就不需要交叉编译?
    错,也要, 树莓派有时因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器,操作系统也是代码,也要编译!

    平台运行需要至少两种东西:bootloader(启动引导代码)以及操作系统核心

    宿主机(host):编辑和编译程序的平台,一般是基于X86的PC机,通常也称为主机
    目标机(target):用户开发的系统,通常都是非X86平台,host 编译得到的可执行代码在 target 上运行,比如:树莓派

    3.交叉编译需要用到什么工具?

    交叉编译器,也称为交叉编译工具链

    展开全文
  • 交叉编译器的安装方法

    千次阅读 2016-03-22 20:53:47
    交叉编译器的安装方法,通常交叉编译器的打包发布方式有关: >> 如果以 deb 包形式发布,则需要用 dpkg 命令进行安装。示例命令: host$ dpkg -i package.deb >>如果以 bin 方式打包发布,通常则需要为该文件加上可...

            首先简单介绍一下,所谓的搭建交叉编译环境,即安装、配置交叉编译工具链。在该环境下编译出嵌入式Linux系统所需的操作系统、应用程序等,然后再上传到目标机上。

           交叉编译工具链是为了编译、链接、处理和调试跨平台体系结构的程序代码。对于交叉开发的工具链来说,在文件名称上加了一个前缀,用来区别本地的工具链。例如,arm-linux-表示是对arm的交叉编译工具链;arm-linux-gcc表示是使用gcc的编译器。除了体系结构相关的编译选项以外,其使用方法与Linux主机上的gcc相同,所以Linux编程技术对于嵌入式同样适用。不过,并不是任何一个版本拿来都能用,各种软件包往往存在版本匹配问题。例如,编译内核时需要使用arm-linux-gcc-4.3.3版本的交叉编译工具链,而使用arm-linux-gcc-3.4.1的交叉编译工具链,则会导致编译失败。

            那么gcc和arm-linux-gcc的区别是什么呢?区别就是gcc是linux下的C语言编译器,编译出来的程序在本地执行,而arm-linux-gcc用来在linux下跨平台的C语言编译器,编译出来的程序在目标机(如ARM平台)上执行,嵌入式开发应使用嵌入式交叉编译工具链。


            交叉编译器的安装方法,通常交叉编译器的打包发布方式有关:
    >> 如果以 deb 包形式发布,则需要用 dpkg 命令进行安装。示例命令:
    host$ dpkg -i package.deb
    >>如果以 bin 方式打包发布,通常则需要为该文件加上可执行权限,然会运行这个文
    件,完成安装
    。示例命令:
    host$ chmod +x package.bin
    host$ ./package.bin
    >>如果以.tar.bz2 压缩包方式发布,则只需在某个目录下进行解压即可。
    host$ tar xjvf package.tar.bz2
    以上 3 条命令中,在实际中须将 package 替换为实际文件名称。
    由于以 deb 或者 bin 方式发布的工具链对不同版本的操作系统适应性较差,所以大多数
    都采用.tar.bz2 这样的压缩包形式发布,下面重点讲述这种工具链的安装方法。


    1.下载arm-linux-gcc-3.4.1.tar.bz2到任意的目录下,我把它下载到了我的个人文件夹里 /home/satellite 

    arm-linux-gcc-3.4.1.tar.bz2 的下载地址如下:

    http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2


    2. 解压 arm-linux-gcc-3.4.1.tar.bz2

       #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2

     

    3. 修改环境变量,把交叉编译器的路径加入到PATH。

            方法一:临时设置系统环境变量,是通过 export 命令,将交叉编译器的路径添加到系统 PATH 环境变量中。用法(多个值之间用冒号隔开):

    host$ export PATH=$PATH:/交叉编译器路径

    紧接前面这个示例,在添加交叉编译器路径前,先查看系统 PATH 的值:

    chenxibing@linux-compiler: ~$ echo $PATH

    /home/chenxibing/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

    添加工具链路径:

    $ export PATH=$PATH:/home/ctools/arm-2011.03/bin/
    再次查看 PATH 的值:
    chenxibing@linux-compiler: ~$ echo $PATH
    /home/chenxibing/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games: /home/
    ctools/arm-2011.03/bin/
    可以看到,交叉编译器的路径已经被添加到系统 PATH 变量中。此时在终端输入arm-none-linux-gnueabi-,然后按键盘 TAB 键,可以看到很多 arm-none-linux-gnueabi-开头的
    命令被列了出来,说明系统已经能够正确找到交叉编译器了。
    chenxibing@linux-compiler: ~$ arm-none-linux-gnueabiarm-none-linux-gnueabi-addr2line     arm-none-linux-gnueabi-cpp           arm-none-linux-gnueabi-gcov       
    arm-none-linux-gnueabi-nm        arm-none-linux-gnueabi-size      arm-none-linux-gnueabi-ar         
    arm-none-linux-gnueabi-elfedit       arm-none-linux-gnueabi-gdb           arm-none-linux-gnueabi-objcopy    
    arm-none-linux-gnueabi-sprite    arm-none-linux-gnueabi-as            arm-none-linux-gnueabi-g++        
    arm-none-linux-gnueabi-gdbtui        arm-none-linux-gnueabi-objdump       arm-none-linux-gnueabi-strings
    arm-none-linux-gnueabi-c++           arm-none-linux-gnueabi-gcc          arm-none-linux-gnueabi-gprof      
    arm-none-linux-gnueabi-ranlib        arm-none-linux-gnueabi-strip    arm-none-linux-gnueabi-c++filt    
    arm-none-linux-gnueabi-gcc-4.5.2     arm-none-linux-gnueabi-ld            arm-none-linux-gnueabi-readelf
    这种方法设置环境变量,只能对当前终端有效,关闭终端再次打开将会失效,需要重新设置。

            方法二:修改全局配置文件 

            在终端中添加环境变量,需要每次打开终端都设置,也很麻烦。可以考虑将设置的过程添加到系统配置文件中。/etc/profile 是系统全局的配置文件,在该文件中设置交叉编译器的路径,能够让登录本机的全部用户都可以使用这个编译器。
            打开终端,输入“sudo vi /etc/profile”命令,打开/etc/profile 文件,在文件末尾添加:
    export PATH=$PATH:/home/ctools/arm-2011.03/bin/

            然后输入“. /etc/profile”(点+空格+文件名),执行 profile 文件,使刚才的改动生效。如果没有书写错误,此时打开终端,输入 arm-none-linux-gnueabi-,然后按键盘 TAB 键,同样可以看到很多 arm-none-linux-gnueabi-开头的命令。

            方法三:修改用户配置文件

            “/etc/profile”是全局配置文件,会影响登录本机的全部用户。如果不希望影响其他用户,也可以只修改当前用户的配置文件,通常是“~/.bashrc”或者“~/.bash_profile”。
    修改方法与修改“/etc/profile”类似,这是无需 sudo,直接 vi 打开即可,在文件末尾增加:
    export PATH=$PATH:/home/ctools/arm-2011.03/bin/
            与执行“/etc/profile”的方式一样,输入“. .bashrc”或者“. .bash_profile”,执行修改过的文件,使修改生效。如果无误,打开终端,输入 arm-none-linux-gnueabi-,然后按键盘 TAB键,同样可以看到很多 arm-none-linux-gnueabi-开头的命令。

    4. 立即使新的环境变量生效,不用重启电脑:

                     对应方法一:#source /root/.bashrc

                     对应方法二:# source /etc/profile

    5. 检查是否将路径加入到PATH:

                     # echo $PATH

      显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。

    6. 测试是否安装成功

       # arm-linux-gcc -v  

    上面的命令会显示arm-linux-gcc信息和版本


    7.编译

    Hello World程序,测试交叉工具链

    写下下面的Hello World程序,保存为

    hello.c

       #include 

        int main()

        {

        printf("Hello World!\n");

           return 0;

        }

    执行下面的命令:

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

            源程序有错误的话会有提示,没有任何提示的话,就是通过了,就可以下载到ARM目标板上运行了!接着可以输入file hello的命令,查看生成的hello文件的类型,要注意的是生成的可执行文件只能在ARM体系下运行,不能在其于X86的PC机上运行。


            但是事情总有例外,很有可能在终端输入
    arm-none-linux-gnueabi-gcc 命令后,得到的却是下面的结果:

    -bash: ./arm-none-linux-gnueabi-gcc:  没有那个文件或目录
    此时请确认:

    (1)  在某个目录下确实存在 arm-none-linux-gnueabi-gcc 文件;
    (2)  在终端输入 arm-none-linux-gnueabi-,按 TAB 键,能找到 arm-none-linux-gnueabi-*系列命令。

            如果这两个条件都确认无误,那么问题就好解决了。这种问题主要发生在 64 位操作系统上,原因在于大多数交叉编译器为了适应性,通常以 32 位发布,而实际系统是 64 位的,存在架构差异,所以不能执行。解决办法很简单,安装 32 位兼容库就好了。在 Ubuntu 12.04 上的安装命令:

    $sudo apt-get install ia32-libs
    >> 32 兼容库需要从 Ubuntu 的源下载,所以此时主机系统应当能访问互联网。
    >> 在 Ubuntu 12.04 64 位下安装 32 位库的名字为 ia32-libs,在其它版本的 Ubuntu名称可能有变

    展开全文
  • 在折腾嵌入式开发,用到交叉编译器的时候,常常会看到这样的名字: arm-xscale-linux-gnueabi-gcc arm-liunx-gnu-gcc 等等  其中,对应的交叉编译器的前缀为: arm-xscale-linux-gnueabi- arm-liunx-gnu-  下面...

          在折腾嵌入式开发,用到交叉编译器的时候,常常会看到这样的名字:

    arm-xscale-linux-gnueabi-gcc

    arm-liunx-gnu-gcc

    等等

           其中,对应的交叉编译器的前缀为:

    arm-xscale-linux-gnueabi-

    arm-liunx-gnu-

         下面以编译crosstool-ng中:通过ct-ng list-samples中得到的输出为例,当做交叉编译器的名字的例子,供参考:



    交叉编译工具链的命名规则为:

    arch [-vendor] [-os] [-(gnu)eabi]

    arch – 体系架构,如ARM,MIPS

    vendor – 工具链提供商

    os – 目标操作系统

    eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface)


        根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如

    arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。他使用的是newlib这个专用于嵌入式系统的C库。

    arm-none-linux-eabi:用于Linux的,使用Glibc


    下面是详细解析

    一、交叉编译器的命名规则

    1、交叉编译器名字中的arch部分

              arch,即系统架构

              表示交叉编译器,是用于哪个目标系统架构中,用于那个平台中的。即,用此交叉编译器编译出来的程序,是运行在哪种CPU上面的。

              arch的值,常见的有很多种,比如arm,x86,mips等等。

    举例:交叉编译器中的arch的值
    
    arm-cortex_a8-linux-gnueabi中的arm
    
    mips-ar2315-linux-gnu中的mips
    
    powerpc-e500v2-linux-gnuspe中的powerpc
    
    x86_64-unknown-mingw32中的x86_64
    


    1.1 crosstool-ng中arch的值

           crosstool-ng中,和arch对应的值,应该就是"Target options"中的"Target Architecture"的值了。

           比如常见的,配置为arm的话,就是:


          对应的配置参数是:ARCH_arm


    2、交叉编译器名字中的vendor部分

              vendor,即生成厂家,提供商

              表示谁提供的,即谁制作出来这个交叉编译器的。vendor的值,貌似是可以自己随便填写的。

              其他常见写法,还有写成编译交叉编译器的作者的自己的名字的。比如,我叫crifan,那么就可以写成crifan,然后生成的交叉编译器,就是xxx-crifan-xxx-xxx了。

              更加通用的做法,好像是:把vendor写成,体系架构的值,比如我之前针对xscale的去配置crosstool-ng的时候,就写了个xscale。或者写成CPU的厂家的名字,或者是开发板的名字等等。

    举例:交叉编译器中的vendor的值
    
    arm-cortex_a8-linux-gnueabi中的cortex_a8,就属于CPU的名字
    
    mips-ar2315-linux-gnu中的ar2315
    
    powerpc-e500v2-linux-gnuspe中的e500v2,也是CPU的内核名
    
    arm-buildroot-linux-uclibcgnueabi中的buildroot,是之前折腾Buildroot时,看到的,即Buildroot把自己视为当前自己制作出来的交叉编译器的vendor。
    


    2.1 crosstool-ng中vendor的值

           crosstool-ng中,和vendor对应的值,应该就是"Toolchain options"中的"Tuple's vendor string"的值了。

           比如我之前配置为xscale的话,就是:


    对应的配置参数是:CT_TARGET_VENDOR

    对应的help的解释是:




    3、交叉编译器名字中的kernel部分

              kernel,直译为,内核

             其实指的是,你用此交叉编译器,编译出来的程序,所运行的目标系统。即此交叉编译器,编译出来的程序,在什么系统中,什么环境中,运行

             而对应的环境或系统,主要有两种:

    a -- Linux

          表示:有OS(此处主要指的是Linux)操作系统的环境

          比如,我用交叉编译器,编译一个helloworld程序,然后下载到嵌入式开发中的嵌入式Linux中运行,就属于用此交叉编译器编译出来的程序,是要运行于带OS即嵌入式Linux系统环境中的。

         此处,简称为有OS的目标系统:Linux


    b -- bare-metal

           bare-metal,直译为:裸金属

           表示无(此处主要指的是Linux)操作系统的环境,比如,用此交叉编译器,去编译一个Uboot,或者是其他一个小程序,是运行在,无嵌入式Linux的时候,单独运行的一个程序。

           比如,你购买的嵌入式系统开发版,常常附带一些小程序,比如点亮LED,跑马灯等程序,就是这种,运行在无OS的环境的

          此处,简称为无OS系统的:bare-metal


    3.1 crosstool-ng中kernel的值

           crosstool-ng中,和kernel对应的值,应该就是"Operating System"中的"Target OS"的值了。

    比如我之前配置为Linux的话,就是:


    对应的配置参数是:GEN_CHOICE_KERNEL中的CT_KERNEL_linux

    对应的help的解释是:



    4、交叉编译器名字中的system部分

              system,直译为,系统

              其实主要表示的,交叉编译器所选择的库函数和目标系统,最常见的一些值有,gnu,gnueabi,uclibcgnueabi等等。

              其中,此处有几方面的值,表示了几方面的含义:

    4.1 system中的gnu

            好像都是gnu

            不是很明白,貌似是:

            gnu == gnu libc == glibc

            即,gnu,就是表示用的是glibc的意思

    a -- crosstool-ng中system为gnu的情况

           crosstool-ng中,和system中gnu对应的值,应该就是"C-library"中的"C library"的值设置为"glibc"了。


    对应的配置参数是:CT_LIBC_glibc

    对应的help的解释是:



    4.2 system中的eabi

           与此相对应的,之前早期的是oabi

    a -- crosstool-ng中system为eabi的情况

          crosstool-ng中,和system中eabi对应的值,应该就是"Target options"中的"-*- Use EABI"的值了。


    注意:此处是选择的ARM,EABI在此处,已经是默认,无法修改的值,只能是EABI了。

    好像是因为,Linux内核等其他选择导致的,此处无法更改EABI。

    对应的配置参数是:CT_ARCH_ARM_EABI

    对应的help的解释是:



    4.3 system中的uclibc

          uclibc,是c库中的一种

          crosstool-ng中,目前支持三种:glibc,eglibc,uclibc

    a -- crosstool-ng中system为uclibc的情况

           crosstool-ng中,和system中uclibc对应的值,应该就是"C-library"中的"C library"的值设置为"uClibc"了。


    对应的配置参数是:CT_LIBC_uClibc

    对应的help的解释是:



    所以,针对上述,gnu,eabi,uclibc等几个选项,对应的常见的一些组合的含义是:

    gnu 等价于:glibc+oabi

    gnueabi 等价于:glibc+eabi

    uclibc 等价于:uclibc+oabi

    举例:交叉编译器中的system的值
    
    arm-cortex_a8-linux-gnueabi中的gnueabi,即glibc+eabi
    
    mips-ar2315-linux-gnu中的gnu,即glibc+oabi
    
    powerpc-e500v2-linux-gnuspe中的gnuspe,没搞懂啥意思。。
    
    x86_64-unknown-mingw32中的mingw32,用的是Windows下的mingw32的库
    


    二、交叉编译工具链实例

    1、arm-none-eabi-gcc

           (ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)

             用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。

    2、arm-none-linux-gnueabi-gcc

            (ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)

            主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx 交叉编译工具的浮点运算非常优秀。一般ARM9、ARM11、Cortex-A 内核,带有 Linux 操作系统的会用到。

    3、arm-eabi-gcc

            Android ARM 编译器。

    4、armcc

           ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc,所以 armcc 编译器都是收费的(爱国版除外,呵呵~~)。

    5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc

           arm-none-uclinuxeabi 用于uCLinux,使用Glibc。

           arm-none-symbianelf 用于symbian,没用过,不知道C库是什么 。

    Codesourcery

         Codesourcery推出的产品叫Sourcery G++ Lite Edition,其中基于command-line的编译器是免费的,在官网上可以下载,而其中包含的IDE和debug 工具是收费的,当然也有30天试用版本的。

         目前CodeSourcery已经由明导国际(Mentor Graphics)收购,所以原本的网站风格已经全部变为 Mentor 样式,但是 Sourcery G++ Lite Edition 同样可以注册后免费下载

         Codesourcery一直是在做ARM目标 GCC 的开发和优化,它的ARM GCC在目前在市场上非常优秀,很多 patch 可能还没被gcc接受,所以还是应该直接用它的(而且他提供Windows下[mingw交叉编译的]和Linux下的二进制版本,比较方便;如果不是很有时间和兴趣,不建议下载 src 源码包自己编译,很麻烦,Codesourcery给的shell脚本很多时候根本没办法直接用,得自行提取关键的部分手工执行,又费精力又费时间,如果想知道细节,其实不用自己编译一遍,看看他是用什么步骤构建的即可,如果你对交叉编译器感兴趣的话。


    ABI 和 EABI

    a -- ABI

           二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。

    b -- EABI

           嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

         两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)

    arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc

           两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。

           其实这两个交叉编译器只不过是 gcc 的选项 -mfloat-abi 的默认值不同。gcc 的选项 -mfloat-abi 有三种值 soft、softfp、hard(其中后两者都要求 arm 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容):

    soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。

    softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。

    hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

    把以下测试使用的C文件内容保存成 mfloat.c:

    #include <stdio.h>
    int main(void)
    {
        double a,b,c;
        a = 23.543;
        b = 323.234;
        c = b/a;
        printf(“the 13/2 = %f\n”, c);
        printf(“hello world !\n”);
        return 0;
    }

    1、使用 arm-linux-gnueabihf-gcc 编译

    使用“-v”选项以获取更详细的信息:

    # arm-linux-gnueabihf-gcc -v mfloat.c
    COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
    -mfloat-abi=hard

    可看出使用hard硬件浮点模式。


    2、使用 arm-linux-gnueabi-gcc 编译

    # arm-linux-gnueabi-gcc -v mfloat.c
    COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
    -mfloat-abi=softfp


    展开全文
  • 交叉编译器制作教程

    千次阅读 2018-08-29 13:50:41
    原文地址:... 目录(?)[-] 为什么要编译两次GCC configure error missing required tool bison configure error missing required tool flex configure error could n...
  • 什么是交叉编译器

    2020-06-06 23:58:38
    在 Linux 下进行 C 程序开发, 我们使用的 gcc 编译器进行代码的编译, 编译完, 直接在 X86 架构下的 PC 下运行的。...译器并且该编译器在 X86 架构下运行, 这个编译器我们通常称为交叉编译器。 ...
  • 交叉编译工具链

    2016-09-25 09:27:00
    1、嵌入式开发模型-交叉开发 在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。 在宿主机执行编译的流程如下: 2、交叉编译工具链详解...
  • 交叉编译

    千次阅读 2019-06-18 10:56:17
    交叉编译及交叉编译器 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译 什么时候需要交叉编译 在一个平台上生成另一个平台上...
  • 交叉编译器制作流程

    2019-05-31 00:28:28
    由于项目的需要,我们需要一个能在x86平台上运行,生成mips应用程序的交叉编译器,最近几天一直在搞这个,看了很多的文章也试了不少的方法,最后终于成功了,还不错,有些新的和大家交流一下。 什么是交叉编译器? ...
  • 交叉编译器的安装方法

    千次阅读 2018-08-05 20:46:34
    首先简单介绍一下,所谓的搭建交叉编译环境,即安装、配置交叉编译工具链。在该环境下编译出嵌入式Linux系统所需的操作系统、应用程序等,然后再上传到目标机上。  交叉编译工具链是为了编译、链接、处理和调试跨...
  • 嵌入式Linux系统移植 嵌入式Linux系统移植是进行Linux驱动开发的基础,如果连Linux系统移植都完成不了,那就更不用说驱动开发了。因此,Linux系统移植至关重要。 嵌入式Linux系统的移植要点 ...安装交叉编译...
  • 文章目录ubuntu下安装交叉编译器(1)安装方法一(2) 安装方法二 ubuntu下安装交叉编译器 (1)安装方法一 打开ubuntu终端 使用sudo apt list gcc-arm*可以查看所有的交叉编译器,假设安装gcc-arm-linux-gnueabihf,...
  • 交叉编译器

    2018-10-15 20:52:00
    http://linuxfromscratch.org/clfs/view/clfs-2.0/arm/ ... build / host / target 这是三个平台,其中host / target的概念我们在以前VxWorks产品的开发中应该已经比较了解。以目前我们...
  • 树莓派官方交叉编译器

    热门讨论 2013-12-16 22:49:18
    树莓派官方交叉编译器,树莓派官网提供的下载链接服务器在国外太慢了,这边提供一个,方便国内玩家下载.为 bcm2708hardfp.
  • Windows 下的 MIPS GCC 交叉编译器

    热门讨论 2013-10-03 10:49:37
    用于 MinGW/MSYS 下的 MIPS 交叉编译器,默认指令集为 mips32r2。
  • 交叉编译器详解

    2019-11-11 10:35:21
    1.什么是交叉编译器 嵌入式开发一般都是在x86平台下开发,而编译出来的软件要在arm平台上跑,所以需要交叉编译器,交叉的意思就是在一个架构上编译出另一个架构的代码。arm平台一般资源有限,不适合做开发 交叉...
  • ubuntu交叉编译器

    2012-08-29 17:16:28
    教材是以RED HAT 为基础写的,...交叉编译环境的配置 sudo gedit /etc/environment,把文件内容改为PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/opt/EmbedSky/4.3.3/bin"。然后s
  • 如何选择交叉编译器

    2019-08-16 09:09:24
    1,arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别 转载地址: https://blog.csdn.net/real_myth/article/details/51481621 2,当下载所需版本时, 进入 arm官网:...

空空如也

1 2 3 4 5 ... 20
收藏数 50,408
精华内容 20,163
关键字:

交叉编译器