精华内容
下载资源
问答
  • 交叉编译

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

    交叉编译

    交叉编译及交叉编译器

    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译

    什么时候需要交叉编译

    1. 在一个平台上生成另一个平台上的可执行代码时
      注意这里的平台,实际上包含两个概念:

      • 体系结构(Architecture
      • 操作系统(OperatingSystem)

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

    参考文章

    [1] Introduction to cross-compiling for Linux

    [2] binutils介绍

    [3] glibc 各个库作用介绍

    [4] uclibc eglibc glibc之间的区别和联系

    [5] Glibc vs uClibc Differences

    展开全文
  • 交叉编译详解

    2021-02-23 13:31:29
    第 1 章 交叉编译简介 1.1 什么是交叉编译 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用? 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地...

    第 1 章 交叉编译简介

    1.1 什么是交叉编译

    对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?

    在解释什么是交叉编译之前,先要明白什么是本地编译。

    本地编译

    本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

    比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

    交叉编译

    交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

    比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

    1.2 为什么会有交叉编译

    之所以要有交叉编译,主要原因是:

    • Speed: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
    • Capability: 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
    • Availability: 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
    • Flexibility: 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

    1.3 为什么交叉编译比较困难

    交叉编译的困难点在于两个方面:

    不同的体系架构拥有不同的机器特性

    • Word size: 是64位还是32位系统
    • Endianness: 是大端还是小端系统
    • Alignment: 是否必修按照4字节对齐方式进行访问
    • Default signedness: 默认数据类型是有符号还是无符号
    • NOMMU: 是否支持MMU

    交叉编译时的主机环境与目标环境不同

    • Configuration issues:
    • HOSTCC vs TARGETCC:
    • Toolchain Leaks:
    • Libraries:
    • Testing:

    详细的对比可以参看这篇文章,已经写的很详细了,在这就不细说了:Introduction to cross-compiling for Linux

    第 2 章 交叉编译链

    2.1 什么是交叉编译链

    明白了什么是交叉编译,那我们来看看什么是交叉编译链。

    首先编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:

    编译流程

    那么编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。

    同时编译过程又是一个有先后顺序的流程,它必然牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,这就形成了一个链式结构。

    因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

    注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉工具链。本文对这两个概念不加以区分,都是指编译链

    2.2 交叉编译链的命名规则

    我们使用交叉编译链时,常常会看到这样的名字:

    arm-none-linux-gnueabi-gcc
    arm-cortex_a8-linux-gnueabi-gcc
    mips-malta-linux-gnu-gcc
    

    其中,对应的前缀为:

    arm-none-linux-gnueabi-
    arm-cortex_a8-linux-gnueabi-
    mips-malta-linux-gnu-
    

    这些交叉编译链的命名规则似乎是通用的,有一定的规则:

    arch-core-kernel-system
    
    • arch: 用于哪个目标平台。
    • core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。
    • kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。
    • systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。

    注意:这个规则是一个猜测,并没有在哪份官方资料上看到过。而且有些编译链的命名确实没有按照这个规则,也不清楚这是不是历史原因造成的。如果有谁在资料上见到过此规则的详细描述,欢迎指出错误。

    第 3 章 包含的工具

    3.1 Binutils

    Binutils是GNU工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。

    Binutils工具包含的子程序如下:

    • ld GNU连接器the GNU linker.
    • as GNU汇编器the GNU assembler.
    • addr2line 把地址转换成文件名和所在的行数
    • ar A utility for creating, modifying and extracting from archives.
    • c++filt Filter to demangle encoded C++ symbols.
    • dlltool Creates files for building and using DLLs.
    • gold A new, faster, ELF only linker, still in beta test.
    • gprof Displays profiling information.
    • nlmconv Converts object code into an NLM.
    • nm Lists symbols from object files.
    • objcopy Copys and translates object files.
    • objdump Displays information from object files.
    • ranlib Generates an index to the contents of an archive.
    • readelf Displays information from any ELF format object file.
    • size Lists the section sizes of an object or archive file.
    • strings Lists printable strings from files.
    • strip Discards symbols

    binutils介绍

    3.2 GCC

    GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。

    3.3 GLibc

    Linux上通常使用的C函数库为glibc。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

    glibc 各个库作用介绍

    因为嵌入式环境的资源及其紧张,所以现在除了glibc外,还有uClibc和eglibc可以选择,三者的关系可以参见这两篇文章:

    uclibc eglibc glibc之间的区别和联系

    Glibc vs uClibc Differences

    3.4 GDB

    GDB用于调试程序

    第 4 章 如何得到交叉编译链

    既然明白了交叉编译链的功能,那么在针对嵌入式系统开发时,我们需要的交叉编译链从哪儿得到?

    主要有三个方式可以获取

    4.1 下载已经做好的交叉编译链

    使用其他人针对某些CPU平台已经编译好的交叉编译链。我们只需要找到合适的,下载下来使用即可。

    常见的交叉编译链下载地址:

    1. 在 http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载已经编译好的交叉编译链
    2. 在 http://www.denx.de/en/Software/WebHome 下载已经编译好的交叉编译链
    3. https://launchpad.net/gcc-arm-embedded下载已经编译好的交叉编译链
    4. 一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用。如crosstool-NG
    5. 如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。

    厂家提供的工具一般是经过了严格的测试,并打入了一些必要的补丁,所以这种方式往往是最可靠的工具来源。

    4.2 使用工具定制交叉编译链

    使用现存的制作工具,以简化制作交叉编译链这个事情的复杂度。我们只需要了解有哪些工具可以实现,并选个合适的工具,搞懂它的操作步骤即可。

    1. crosstool-NG
    2. Buildroot
    3. Embedded Linux Development Kit (ELDK)

    工具还有很多,各有各的优势和劣势,大家可以慢慢研究,在这就不细说了。

    4.3 从零开始构建交叉编译链

    这个是最困难也最耗时间的,毕竟制作交叉编译链这样的事情,需要对嵌入式的编译原理了解的比较透彻,至少要知道出了问题要往哪个方面去翻阅资料。而且,也是最考耐心和细心的地方,配错一个选项或是一个步骤,都可能出现以前从来没见过的问题,而且这些问题往往还无法和这个选项或步骤直接联系起来。

    当然如果搭建出来,肯定也是收获最大的,至少对于编译的流程和依赖都比较清楚了,细节上的东西可能还需要去翻看相应的协议或标准,但至少骨架会比较清楚。

    详细的搭建过程可以参看后续的文章,这里面有详细的参数和步骤:
    交叉编译详解 二 从零制作交叉编译链

    为了方便大家搭建交叉编译链,我写了一个一键生成的脚本(包括源码下载和自动编译)。如果大家自己一直搭建不成功,不妨试试这个脚本,然后对比下自己的流程是否一致,参数是否有差异,也许能帮大家迈过这个障碍:
    交叉编译详解 三 使用脚本自动生成交叉编译链

    4.4 对比三种构建方式

    项目 使用已有交叉编译链 自己制作交叉编译链
    安装 一般提供压缩包 需要自己打包
    源码版本 一般使用较老的稳定版本,对于一些新的GCC特性不支持 可以使用自己需要的GCC特性的版本
    补丁 一般都会打上修复补丁 普通开发者很难辨别需要打上哪些补丁,资深开发者可以针对自己的需求合入补丁
    源码溯源 可能不清楚源码版本和补丁情况 一切都可以定制
    升级 一般不会升级 可以随时升级
    优化 一般已经针对特定CPU特性和性能进行优化 一般无法做到比厂家优化的更好,除非自己设计的CPU
    技术支持 可以通过FAE进行支持,可能需要收费 只能通过社区支持,免费
    可靠性验证 已经通过了完善的验证 自己验证,肯定没有专业人士验证的齐全

    参考资料

    [1] Introduction to cross-compiling for Linux

    [2] binutils介绍

    [3] glibc 各个库作用介绍

    [4] uclibc eglibc glibc之间的区别和联系

    [5] Glibc vs uClibc Differences

    [6] 交叉编译链下载地址

    展开全文
  • Qt5.10.1的交叉编译过程

    千次阅读 2019-07-25 20:28:07
    尽管网上有很多Qt交叉编译的教程,但自己操作的时候还是遇到很多问题,主要是环境配置的问题以及对qt中configure的不熟悉。写下来以防自己忘记。 主机:unbuntu 16.04 qt版本:5.10.1 目标版:全志R11 编译工具链...

    尽管网上有很多Qt交叉编译的教程,但自己操作的时候还是遇到很多问题,主要是环境配置的问题以及对qt中configure的不熟悉。写下来以防自己忘记。

    主机:unbuntu 16.04

    qt版本:5.10.1

    目标版:全志R11

    编译工具链:全志SDK包中的交叉编译工具arm-openwrt-linux-gcc。

    要交叉编译的话还是需要配置qmake.conf,到./qt-everywhere-src-5.10.1/qtbase/mkspecs/linux-arm-gnueabi-g++目录下面的qmake.conf进行修改。我的修改如下

    #
    # qmake configuration for building with arm-linux-gnueabi-g++
    #
    
    MAKEFILE_GENERATOR      = UNIX
    CONFIG                 += incremental
    QMAKE_INCREMENTAL_STYLE = sublib
    
    #默认显示方式是linuxfb
    QT_QPA_DEFAULT_PLATFORM = linuxfb
    #设置使用ARM高级特性的标志,根据自己的架构来定
    QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a -lts
    QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a -lts
    
    include(../common/linux.conf)
    include(../common/gcc-base-unix.conf)
    include(../common/g++-unix.conf)
    
    # modifications to g++.conf
    QMAKE_CC                = arm-openwrt-linux-gcc
    QMAKE_CXX               = arm-openwrt-linux-g++
    QMAKE_LINK              = arm-openwrt-linux-g++
    QMAKE_LINK_SHLIB        = arm-openwrt-linux-g++
    
    # modifications to linux.conf
    QMAKE_AR                = arm-openwrt-linux-ar cqs
    QMAKE_OBJCOPY           = arm-openwrt-linux-objcopy
    QMAKE_NM                = arm-openwrt-linux-nm -P
    QMAKE_STRIP             = arm-openwrt-linux-strip
    load(qt_config)

    主要的就是把编译工具换成交叉编译的工具。

    接下来在./qt-everywhere-src-5.10.1/下配置configure。可以使用一个.sh脚本。贴出我的配置表

    ./configure -v \
    -prefix /usr/local/arm_qt-5.10.1-release \
    -extprefix /home/ljw/install/arm_qt5.10.1_test \
    -xplatform linux-arm-gnueabi-g++ \
    -sysroot /home/sc/lichee/out/banjo-R11_pref1/staging_dir/toolchain \
    -opensource \
    -debug \
    -strip \
    -confirm-license \
    -no-opengl \
    -no-pch \
    -shared \
    -no-xcb \
    -no-eglfs \
    -no-opengl \
    -nomake examples \
    -qt-zlib \
    -linuxfb \
    -skip qt3d \
    -skip qtactiveqt \
    -skip qtandroidextras \
    -skip qtcanvas3d \
    -skip qtcharts 
    -skip qtconnectivity \
    -skip qtdatavis3d \
    -skip qtdeclarative \
    -skip qtdoc \
    -skip qtgamepad \
    -skip qtgraphicaleffects \
    -skip qtlocation \
    -skip qtmacextras \
    -skip qtnetworkauth \
    -skip qtpurchasing \
    -skip qtquickcontrols \
    -skip qtquickcontrols2 \
    -skip qtremoteobjects \
    -skip qtscript \
    -skip qtscxml \
    -skip qtsensors \
    -skip qtserialbus \
    -skip qtspeech \
    -skip qttools \
    -skip qtvirtualkeyboard \
    -skip qtwayland \
    -skip qtwebchannel \
    -skip qtwebengine \
    -skip qtwebglplugin \
    -skip qtwebsockets \
    -skip qtwebview \
    -skip qtwinextras \
    -skip qtxmlpatterns \
    -skip qtx11extras \
    

    主要讲解几个参数,可以通过.configure --help查看所有的参数设置,本人对这些也没有全部了解,只讲解几个

    -prefix 目标板的引用路径。 这个路径有两个作用,一个是指定目标机的Qt库路径,也就是说,当你把Qt库部署到目标机时,需要把Qt库拷贝到这个路径下,Qt程序就可以自动找到库。第二个是,如果你没有指定extprefix, install的时候会把Qt库部署到sysroot+prefix这个路径下。
    -extprefix 设置编译完成之后,make install所安装的地方

    -xplatform 这个参数十分重要,决定了交叉编译时所使用的平台,之前我们在linux-arm-gnueabi-g++/目录下修改了qmake.conf。所以理所当然选用这个。

    -sysroot 这个参数笔者并没有弄清它具体的作用。这里写出笔者自己的理解,当交叉编译时需要用到交叉编译的库,而非主机自带的库,该参数指定默认搜索库的根目录,比如这里笔者将该参数设置为/home/sc/lichee/out/banjo-R11_pref1/staging_dir/toolchain,查找库默认路径时会在/home/sc/lichee/out/banjo-R11_pref1/staging_dir/toolchain/下查找, 而不是/usr/include 和 /usr/lib 中搜索头文件和库。在没有设置该选项时各种报错缺少库,当然可以自己指定路径,但是这样子比较麻烦,设置之后一遍编译通过。

    在./qt-everywhere-src-5.10.1/执行.sh脚本。之后再~/.profile文件中将自己交叉编译器的路径添加到PATH中,source ~/.profile。

    之后就是make,make install。

    讲述下可能遇到的问题:

    warning: libc.so, needed by /usr/tslib/lib/libts.so, not found (try using -rpath or -rpath-link)
    原因:该系列的问题是交叉编译器找不到对应的库。
    解决方法:添加库,或者在.sh中指定库路径

     

    然而在静态编译的时候,会出现

    error adding symbols: DSO missing from command line
    原因:在高本版的ld链接器中(大概是>=2.22) 当fun()函数在一动态库A中,有一个静态库B编译的时候显示链接了A,编译自己的可执行程序时用到了静态库中fun()函数,链接器不会自动的递归查找导致报错
    该问题的解决方法按照网上说的话是添加动态库路径,但是我这边好像没啥效果,有解决的话请大神指教。

    接下里就是交叉编译所用的一些有助于差错的命令。

    查看当前库中有哪些库包含此函数
    grep -REn "函数名" ./*

    查看库中是否此函数
    nm xxx.so | grep 函数名

    查看可执行文件依赖的动态库
    readelf -d "可执行文件"

     

    展开全文
  • arm交叉编译

    千次阅读 2017-12-04 18:49:14
    arm交叉编译

    1.arm-none-linux-gnueabi-gcc下载

    http://www.veryarm.com/arm-none-linux-gnueabi-gcc

    arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。使用时,按照主机平台,可以下载以下任一版本中的一个,结果是一样的:

    • Linux解压版在Linux主机(如Ubuntu、RedHat等)直接解压即可使用。推荐方式!
    • Linux安装版在Linux主机下执行后按照提示安装后使用。
    • Windows解压版在Windows系统下解压后使用,但是需要MingW32。
    • Windows安装版在Windows系统下安装后使用。
    • RPM安装版RedHat系统安装包,新版本不提供该类安装包。
    • 源码版交叉编译器源代码,一般很少用到。

    为方便国内用户下载使用,我们从Codesourcery(Mentor)官网下载了所有版本的arm-none-linux-gnueabi-gcc编译器,并放到国内云盘上提供下载。因为版本很多,可能难以选择,但是我们建议您使用最新版本,即有最新~标志的下载项。

    1 Linux解压版

    gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2006q1-3-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2006q1-6-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2006q3-26-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2007q1-10-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2007q1-21-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2008q1-126-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2008q3-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.bz2 —— 下载
    arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2011.03-41-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2012.09-64-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2013.05-24-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2013.11-33-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 —— 下载
    arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 最新~推荐!—— 下载

     

    2 Linux安装版

    arm-2006q3-26-arm-none-linux-gnueabi.bin —— 下载
    arm-2007q1-10-arm-none-linux-gnueabi.bin —— 下载
    arm-2007q1-21-arm-none-linux-gnueabi.bin —— 下载
    arm-2007q3-51-arm-none-linux-gnueabi.bin —— 下载
    arm-2008q1-126-arm-none-linux-gnueabi.bin —— 下载
    arm-2008q3-41-arm-none-linux-gnueabi.bin —— 下载
    arm-2008q3-72-arm-none-linux-gnueabi.bin —— 下载
    arm-2009q1-176-arm-none-linux-gnueabi.bin —— 下载
    arm-2009q1-203-arm-none-linux-gnueabi.bin —— 下载
    arm-2009q3-67-arm-none-linux-gnueabi.bin —— 下载
    arm-2010.09-50-arm-none-linux-gnueabi.bin —— 下载
    arm-2010q1-202-arm-none-linux-gnueabi.bin —— 下载
    arm-2011.03-41-arm-none-linux-gnueabi.bin —— 下载
    arm-2011.09-70-arm-none-linux-gnueabi.bin —— 下载
    arm-2012.03-57-arm-none-linux-gnueabi.bin —— 下载
    arm-2012.09-64-arm-none-linux-gnueabi.bin —— 下载
    arm-2013.05-24-arm-none-linux-gnueabi.bin —— 下载
    arm-2013.11-33-arm-none-linux-gnueabi.bin —— 下载
    arm-2014.05-29-arm-none-linux-gnueabi.bin —— 最新~ 下载

     

    3 Windows Mingw32 版

    gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2006q3-26-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2007q1-10-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2007q1-21-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2007q3-51-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2008q1-126-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2008q3-41-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2008q3-72-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2009q1-176-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2009q1-203-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2009q3-67-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2010.09-50-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2010q1-202-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2011.03-41-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2011.09-70-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2012.03-57-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2012.09-64-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2013.05-24-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2013.11-33-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 下载
    arm-2014.05-29-arm-none-linux-gnueabi-i686-mingw32.tar.bz2 —— 最新~ 下载

     

    4 Windows安装版

    gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi.exe —— 下载
    arm-2006q1-3-arm-none-linux-gnueabi.exe —— 下载
    arm-2006q1-6-arm-none-linux-gnueabi.exe —— 下载
    arm-2006q3-26-arm-none-linux-gnueabi.exe —— 下载
    arm-2007q1-10-arm-none-linux-gnueabi.exe —— 下载
    arm-2007q1-21-arm-none-linux-gnueabi.exe —— 下载
    arm-2007q3-51-arm-none-linux-gnueabi.exe —— 下载
    arm-2008q1-126-arm-none-linux-gnueabi.exe —— 下载
    arm-2008q3-41-arm-none-linux-gnueabi.exe —— 下载
    arm-2008q3-72-arm-none-linux-gnueabi.exe —— 下载
    arm-2009q1-176-arm-none-linux-gnueabi.exe —— 下载
    arm-2009q1-203-arm-none-linux-gnueabi.exe —— 下载
    arm-2009q3-67-arm-none-linux-gnueabi.exe —— 下载
    arm-2010.09-50-arm-none-linux-gnueabi.exe —— 下载
    arm-2010q1-202-arm-none-linux-gnueabi.exe —— 下载
    arm-2011.03-41-arm-none-linux-gnueabi.exe —— 下载
    arm-2011.09-70-arm-none-linux-gnueabi.exe —— 下载
    arm-2012.03-57-arm-none-linux-gnueabi.exe —— 下载
    arm-2012.09-64-arm-none-linux-gnueabi.exe —— 下载
    arm-2013.05-24-arm-none-linux-gnueabi.exe —— 下载
    arm-2013.11-33-arm-none-linux-gnueabi.exe —— 下载
    arm-2014.05-29-arm-none-linux-gnueabi.exe —— 最新~ 下载

     

    5 PRM安装版

    arm-arm-none-linux-gnueabi-2007q3-51.i686.rpm —— 下载

     

    6 源码

    gnu-csl-arm-2005Q1B-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2006q1-3-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2006q1-6-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2006q3-26-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2007q1-10-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2007q1-21-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2007q3-51-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2008q1-126-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2008q3-41-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2008q3-72-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2009q1-176-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2009q1-203-arm-none-linux-gnueabi.src.tar.bz2.bz2 —— 下载
    arm-2009q3-67-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2010.09-50-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2010q1-202-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2011.03-41-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2011.09-70-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2012.03-57-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2012.09-64-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2013.05-24-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2013.11-33-arm-none-linux-gnueabi.src.tar.bz2 —— 下载
    arm-2014.05-29-arm-none-linux-gnueabi.src.tar.bz2 —— 最新~ 下载

     

    Mentor官方下载地址(需要注册,注册之后官方会发送一个下载地址到邮箱里面):http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/evaluations/

     

    文章来自VeryARM:http://www.veryarm.com/arm-none-linux-gnueabi-gcc,转载请保留。

    2.arm-none-linux-gnueabi交叉工具链与arm-linux-gcc 有区别吗?

    http://bdbaishitong.blog.163.com/blog/static/201493080201332094320957/
    eabi标准的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一个链接

    终于,郁闷已久的问题攻破了,用了三种配置交叉编译的方法,最终在开发板上实现成功了,现在想一想,有的时候真的也是运气。

        之前已经试验过使用arm-linux-gcc-3.4.1配置交叉编译编译环境,配置成功了,在开发板上失败了~

        后来使用脚本创建交叉编译环境(crosstool-0.43),配置成功了(这个用了相当长的时间),在开发板上失败了~

        终于,在一个偶然的机会(其实是浏览无数网页后),我终于找到了一个好的方法,并成功在开发板上运行。先说一下网上的一些方法,有些所谓的默认安装了一些程序,但是在实际运行时发现根本没有安装,而且很多地方不知道该如何安装。再有就是文章一上来就说安装什么什么软件,但是在网上搜根本找不到。只能说很多人只转载文章,根本没有试验过。但是我还是幸运的找到了一个靠谱的文章http://www.adamjiang.com/pukiwiki/index.php?%E7%BC%96%E8%AF%91mini2440%E5%B7%A5%E5%85%B7%E9%93%BE

        根据上面的做法,我成功了,在此小做总结。

        首先下载工具链,幸好这篇文章给出了这个网站,要不还不知道要找多久。

    http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

        70多M很快就下完了,若不是root用户下,可以将文件解压到home的某个目录下。

    tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/..../arm

        那么,在这个目录下会生成一个arm-2008q3文件夹。

        更改路径不用说了,或者临时或者非临时。我就直接改~/.bashrc了,在最后加:

        export PATH=/usr/local/arm-2008q3/bin:${PATH}

        ok~现在使你路径生效吧:

        source ~/.bashrc

        再输入:export CROSS_COMPILE=arm-none-linux-gnueabi-

        作用是:当你编译软件的时候,Makefile在大多数情况向会取得CROSS_COMPILE所指定的交叉编译工具。

        也可以输入:export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-

        这种种方法是通过绝对路径来指定交叉编译工具,这样做可以更精确的为交叉编译定位,同时可以避免很多错误。你可以通过下面这样的例子指定交叉编译工具的绝对路径。

        现在一切就绪,随便编译个hello world.c文件,用arm-none-linux-gnueabi-gcc helloworld.c -o helloworld,生成的helloworld文件通过nfs挂载到板子上。

        最最后,在minicom下输入:./helloworld。

        就会显示你希望见到的输出了。。。。。。


    首先,从下面的地址下载工具链

    http://www.codesourcery.com/.../arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

    等待下载完成后,将工具链解压到/usr/local/目录,如果你没有编译主机上的root权限的话,你可以将工具链解压到Linux用户的home目录中的某个位置(比如${HOME}/bin)

    tar xjvfo arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /usr/local

    这个操作将会在/usr/local目录中创建一个么名为arm-2008q3的目录。

    接下来,你需要将这个新进添加的工具链的位置添加到PATH变量之中。编译你的~/.bashrc文件,在其中加入新的PATH变量

    export PATH=/usr/local/arm-2008q3/bin:${PATH}

    使用source命令在当前shell中启用这个变化,这样你就不需要重新登入系统使用新变量了。

    source ~/.bashrc

    或者直接在shell中使用export对当前shell做同样的操作。

    export PATH=/usr/local/arm-2008q3/bin:${PATH}

    如果你并不是bash用户,你可以修改你使用的shell所对应的环境设置文件,比如,对于zsh来说,您应该修改~/.zsh文件。或者,你需要在每次登入shell后首先运行上面的export操作。

    因为在开发主机上进行交叉编译意味着使用开发主机的能力生成另外一个体系结构上运行的二进制代码,所以,一般来说,你需要编译的软件通常都会接受一个叫做CROSS_COMPILE的变量来指定产生哪个体系结构的代码。所以,配置工具链的最后一个步骤就是设置这个变量。如果你现在使用ls命令查看以下

    ls /usr/local/arm-2008q3/bin/

    目录的话,你会看到很多以arm-none-linux-gnueabi-开始的可执行文件,而这个共同的前缀就是你需要的CROSS_COMPILE变量。现在,使用export命令设置环境变量

    export CROSS_COMPILE=arm-none-linux-gnueabi-

    现在,当你编译软件的时候,Makefile在大多数情况向会取得CROSS_COMPILE所指定的交叉编译工具。当然,前提是,这些交叉编译工具在你的PATH变量上。还有一种方法是通过绝对路径来指定交叉编译工具,这样做可以更精确的为交叉编译定位,同时可以避免很多错误。你可以通过下面这样的例子指定交叉编译工具的绝对路径。

    export CROSS_COMPILE=/usr/local/arm-2008q3/bin/arm-none-linux-gnueabi-

    在大多数情况下,你并不需要将上面的export命令加入~/.bashrc这样的文件,因为,你并不总是需要它们来做交叉编译。比如,你仅仅希望编译运行在开发主机上的程序时。

    这样,工具链就准备好了。



    3.arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别

    http://www.veryarm.com/296.html

    命名规则

    交叉编译工具链的命名规则为: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、arm-none-eabi-gcc

    ARM architectureno vendornot target an operating systemcomplies 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 architectureno vendorcreates binaries that run on the Linux operating systemand 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

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

    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

    可看出使用softfp模式。

     

    交叉编译工具

    参考资料

    1. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别:http://www.cnblogs.com/xiaotlili/p/3306100.html
    2. arm-none-linux-gnueabi,arm-none-eabi 与arm-eabi 区别:http://blog.csdn.net/mantis_1984/article/details/21049273
    3. What’s the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490

    文章来自VeryARM:http://www.veryarm.com/296.html,转载请保留。


    http://blog.csdn.net/mantis_1984/article/details/21049273

    arm-none-linux-gnueabi
    链接工具命名:
        arch-vendor-(os-)abi

    1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)
            用于编译ARM架构的u-boot、linux内核、linux应用等
    2、arm-none-eabi 
            用于编译ARM架构的裸机系统(包括linux的 boot、kernel)
    3、arm-eabi 
            Android ARM 编译器

    arm-none-linux-gnueabi交叉编译器是codesourcery公司推出的,基于GCC,但是进行过优化的编译器。官方网站
    http://www.codesourcery.com/
    codesourcery推出的产品叫Sourcery G++ Lite Edition,其中基于command-line的编译器是免费的,在官网上可以下载,而其中包含的IDE和debug 工具是收费的,当然也有30天试用版本的。
    arm-none-linux-gnueabi-xxx用它的最大理由我想应该是浮点运算。

    结果测试发现: int backtrace(void **buffer,int size) 在实际使用过程中,只能打印出空的调用堆栈
    而arm-linux-gcc可以!



    5.交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

    http://www.cnblogs.com/xiaotlili/p/3306100.html

    交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

    自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和我有同样困惑的兄弟…..

    一. 什么是ABI和EABI
    1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)
    在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口.
    ABI涵盖了各种细节,如:
    数据类型的大小、布局和对齐;
    调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;
    系统调用的编码和一个应用如何向操作系统进行系统调用;
    以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。
    一个完整的ABI,像Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
    ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。

    2) EABI: 嵌入式ABI
    嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。
    开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。
    支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。
    EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM.

    二. gnueabi相关的两个交叉编译器: gnueabi和gnueabihf
    在debian源里这两个交叉编译器的定义如下:
    gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
    gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture
    可见这两个交叉编译器适用于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架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
    hard   : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用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,可看出使用softfp模式。

    三. 拓展阅读
    下文阐述了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念

    VFP (vector floating-point)
    从ARMv5开始,就有可选的 Vector Floating Point (VFP) 模块,当然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。
    VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片) 。对于包含NEON的ARM芯片,NEON一般和VFP公用寄存器。

    硬浮点Hard-float
    编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。
    使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。

    软浮点 Soft-float
    编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。
    现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

    armel ABI和armhf ABI
    在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。
    soft是指所有浮点运算全部在软件层实现,效率当然不高,会存在不必要的浮点到整数、整数到浮点的转换,只适合于早期没有浮点计算单元的ARM处理器;
    softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;
    hard则使用FPU浮点寄存器将函数参数传递给FPU处理。
    需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。
    默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。
    而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。
    在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。

    Soft-float和hard-float的编译选项
    在CodeSourcery gcc的编译参数上,使用-mfloat-abi=name来指定浮点运算处理方式。-mfpu=name来指定浮点协处理的类型。
    可选类型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。
    使用-mfloat-abi=hard (等价于-mhard-float) -mfpu=vfp来选择编译成硬浮点。使用-mfloat-abi=softfp就能兼容带VFP的硬件以及soft-float的软件实现,运行时的连接器ld.so会在执行浮点运算时对于运算单元的选择,
    是直接的硬件调用还是库函数调用,是执行/lib还是/lib/vfp下的libm。-mfloat-abi=soft (等价于-msoft-float)直接调用软浮点实现库。

    在ARM RVCT工具链下,定义fpu模式:
    –fpu softvfp
    –fpu softvfp+vfpv2
    –fpu softvfp+vfpv3
    –fpu softvfp+vfpv_fp16
    –fpu softvfp+vfpv_d16
    –fpu softvfp+vfpv_d16_fp16.

    定义浮点运算类型
    –fpmode ieee_full : 所有单精度float和双精度double的精度都要和IEEE标准一致,具体的模式可以在运行时动态指定;
    –fpmode ieee_fixed : 舍入到最接近的实现的IEEE标准,不带不精确的异常;
    –fpmode ieee_no_fenv :舍入到最接近的实现的IEEE标准,不带异常;
    –fpmode std :非规格数flush到0、舍入到最接近的实现的IEEE标准,不带异常;
    –fpmode fast : 更积极的优化,可能会有一点精度损失。

     

    Remember don't at a loss and let the brain to calm down when comes questions, so can solve them faster!

    http://blog.csdn.net/nokiaguy/article/details/8509739

    X86架构的CPU采用的是复杂指令集(Complex Instruction Set Computer,CICS),而ARM架构的CPU使用的是精简指令集(Reduced Instruction Set Computer,RISC)。由于这两种架构的CPU使用了不同的指令集,因此在X86架构上开发可运行在ARM架构上的程序就必须要使用交叉编译器。通常交叉编译器和相关工具包含的了很多可执行文件以及大量的共享库及头文件等资源。这些资源的集合称为交叉编译环境。

            在Internet上可以找到集成好的交叉编译环境,Android NDK和Android源代码中也包含的交叉编译环境。当然,如果我们需要一个完全独立的交叉编译环境,可以下载集成好的交叉编译环境,也可以自己制作(比较复杂,建议读者下载集成好的交叉编译环境)。下面介绍一个CodeSourcery交叉编译环境,这个交叉编译环境直接下载安装就可以安装。

          读者可通过如下的网站访问CodeSourcery下载页面。

    http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/

        上面的页面并未直接提供CodeSourcery的下载链接,读者可以点击“Download the GNU/Linux Release”链接,并输入Email(建议使用Gmail)、地址等信息,最后点击“Get Lite!”按钮提交信息。如图2-29所示。最后系统会将下载地址发送到刚才输入的Email。


    进入下载页面,会看到如图2-30所示的不同版本的下载链接,选择最新的版本即可。

                                 图2-30  CodeSourcery的不同版本

           进入CodeSourcery的下载页面后,会看到如图2-31所示的下载链接。目前CodeSourcery有Windows和Linux两个版本。本书使用的是第1个(IA32 GNU/Linux Installer)。

        Linux版本的安装文件是bin格式,读者可执行下面的命令安装CodeSourcery。其中package表示CodeSourcery的安装文件名。

    sh package.bin

        执行上面的命令后,会显示可视化的安装界面,如图2-32所示,读者可按提示安装CodeSourcery。

         为了使用方便,建议读者将如下路径加到PATH环境变量中。

       /root/compilers/CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin

        下面编写一个简单的C程序来测试一下这个交叉编译环境。

    1. //  first.c  
    2. #include <stdio.h>  
    3. int main()  
    4. {  
    5.     printf("first arm program\n");  
    6.     return 0;  
    7. }  

    输入下面的命令编译first.c文件(需要加-static选项)。

    # arm-none-linux-gnueabi-gcc -static -o first first.c

    输入下面的命令将first文件上传到任意的Android设备的/data/local目录中(没有root权限也可以)。

    # adb push first /data/local

    使用adb shell命令进入Android设备的控制台,并进入/data/local目录,执行如下的命令

    # ./first

         执行上面的命令就会输出“first arm program”信息。first程序在X86架构上运行的Ubuntu Linux中是无法运行的。读者可以试着在Ubuntu Linux中运行first程序,看看会发生什么。

    注意:在安装Code Sourcery的过程中会在/lib目录寻找一个libc.so.6库文件,但在Ubuntu Linux11.04及以上版本/lib目录已经没有libc.so.6库文件了。这个库文件被放在了其他的目录。在32位的Ubuntu Linux中该文件的路径是/lib/i386-linux-gnu/libc.so.6,在64位的Ubuntu Linux中该文件的路径是/lib/x86_64-linux-gnu/libc.so.6。在安装Code Sourcery之前可以使用ln命令为libc.so.6文件在/lib目录建立一个链接。


    下一篇:开发可统计单词个数的Android驱动程序(1) 


    本文节选至《Android深度探索(卷1):HAL与驱动开发》,接下来几篇文章将详细阐述如何开发ARM架构的Linux驱动,并分别利用android程序、NDK、可执行文件测试Linux驱动。可在ubuntu Linux、Android模拟器和S3C6410开发板(可以选购OK6410-A开发板,需要刷Android)


    7.arm-none-linux-gnueabi交叉工具链安装
    http://www.eefocus.com/PSOCPSOC/blog/11-08/228845_b0bc2.html

    arm-none-linux-gnueabi交叉工具链与arm-linux-gcc 的区别:

    参考网友的说法:eabi标准的要好些,可能arm-linux-gcc就是arm-none-linux-gnueabi的一个链接

    参考网友的一些做法:

    1 下载arm-2009q1-203-arm-none-linux-gnueabi.bin
    2 执行./arm-2009q1-203-arm-none-linux-gnueabi.bin 在安装的时候选择推荐的路径/opt/arm2009q1
    3 修改环境变量  gedit~/.bashrc 在文件最后面添加export PATH="/opt/arm-2009q1/bin:$PATH"
    4 修改以后执行 source /.bashrc 使得刚才的设置生效
    5 测试安装结果 输入 arm-none-linux-gnueabi-gcc6 提示NO input file 成功…… 

    我参考他的方法,在网上找arm-2009q1-203-arm-none-linux-gnueabi.bin,但是找了N久没有找到,所以没有参考他的方法,看了一些TI网站的资料,为方便自己查阅,也方便网友参考,少走弯路,特此写下我的安装过程和一些心得,如果网友发现错误,敬请指正。

    1:下载交叉编译工具链

    下载链接为:http://www.codesourcery.com/sgpp/lite/arm/portal/release858

    下载linux/GNU的就可以了,下载下来名字为:

    arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

    下面要使用这个文件安装

    另外说明我是使用的root权限,#sudo -i 切换到root权限下。

    默认是安装在/opt目录下的,一般的Ubuntu安装完成之后都会在根目录下有一个opt目录,

    如果没有就创建一个新的目录

    # mkdir -p /opt

    2:解压源文件

    参考TI的安装,安装路径为/opt目录,解压源文件到/opt目录下。


    # tar -vxjf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt

    3:设置环境变量

    注意我使用的是root权限,如果不是使用的root权限就要改你对应的相应的文件了

    # gedit     ~/.bashrc

    在.bashrc文件的末尾最后添加一行,来增加一个环境变量

    export PATH="/opt/arm-2009q1/bin:$PATH"

    4:使得刚才的设置生效
    # source /.bashrc

    5查看linux的环境变量
    #echo $PATH
    # printenv

    6 测试安装结果 输入

    # arm-none-linux-gnueabi-gcc

    提示NO input file ,

    到此为止安装完毕了,OK,大功告成。


    8、linux下arm-none-linux-gnueabi交叉编译环境的建立

    http://blog.const.net.cn/a/17516.htm

    1.访问codesourcery官方网站下载最新的ARM交叉编译工具链,下载版本arm-2009q3:[喝小酒的网摘]http://blog.const.net.cn/a/17516.htm
    http://www.codesourcery.com/sgpp/lite/arm/portal/package5383/public/arm-none-linux-gnueabi/arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
     
    2.解压
    $ tar -jxvf arm-2009q3-67-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
     
    3.移动到/usr下面
    mv arm-2009q3 /usr/
     
    4.设置环境变量
     $ sudo su
     # vim /etc/bash.bashrc
     在最后加上:
                    export PATH=$PATH:/usr/arm-2009q3/bin
                    export PATH
     启动环境变量设置:
                    #source /root/.bashrc
     检查是否设置成功:
                    #echo $PATH
            结果:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/arm-2009q3/bin
      说明设置好了 :-)
     
    5.检查安装是否成功:
         $ arm-none-linux-gnueabi-gcc -v
         ==>
               Using built-in specs.
    Target: arm-none-linux-gnueabi
    ...
    gcc version 4.4.1 (Sourcery G++ Lite 2009q3-67) 
    说明安装成功。[喝小酒的网摘]http://blog.const.net.cn/a/17516.htm
    展开全文
  • 交叉编译学习笔记(一)——交叉编译和交叉工具链
  • gsoap2.8交叉编译过程笔记

    千次阅读 2018-07-12 12:47:42
    最近在交叉编译gsoap的时候总出现错误,仔细研究试验记录成功编译步骤。1.解压gsoap-2.8,复制两份,命名为gsoap-x86和gsoap-arm2.编译x86下库,进入gsoap-x86目录,执行 ./configure ,make, su -c 'make install'3...
  • 这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构...
  • 上篇介绍了交叉编译的基本原理,以及交叉编译一个简单的HelloWorld程序,这篇将介绍如何交叉编译Qt程序。 由于Qt程序依赖的底层以及第三方的相关库太多(比如libGL.so库为OpenGL库,libX11.so库为系统图像库等等),...
  • 二、编译内核镜像过程 1、编译过程中涉及到到文件: /Makefile 编译产生顶层vmlinux镜像文件 /scripts/Kbuild.include make过程中到一些基本定义 /scripts/Makefile.lib 编译内核时用到到函数库文件 /scripts...
  • 交叉编译理解

    2018-06-07 09:13:56
    第 1 章 交叉编译简介1.1 什么是交叉编译对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?在解释什么是交叉编译之前,先要明白什么是本地编译。本地编译本地编译可以...
  • Cmake 交叉编译

    千次阅读 2018-10-30 14:31:20
    交叉编译 最近由Kitware Robot编辑6个月前 页面历史记录 从版本2.6.0开始,CMake支持交叉编译交叉编译意味着该软件是为不同于构建的系统构建的。 这意味着  CMake无法自动检测目标系统  通常,可执行文件不...
  • CMake交叉编译

    2015-09-08 19:39:26
    如果你的英文比较好,那么可以看这里:...但是我的交叉编译过程不是翻译它的,是根据我自己交叉编译过程,从了解CMake到完成交叉编译写的,容易入门,不涉及深入研究。  转载请注明原出处: http://hi
  • 1.1 什么是交叉编译 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用? 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地编译可以理解为,在当前编译...
  • 自己动手编译交叉编译

    千次阅读 2019-03-09 21:54:07
    这篇文章主要记录一下自己编译 交叉编译链工具的过程。其实很多工作都是别人已经帮我们做好了的,我只是使用一下别人做好的工具。 编译的过程中,主要使用到的工具是:crosstool-ng 编译的流程主要是: 1、先编译...
  • 交叉编译curlftpfs

    2013-12-05 09:14:50
    交叉编译curlftpfs 依赖库: openssl-1.0.0e.tar.gz fuse-2.7.4.tar.gz,不要使用fuse-2.8.3.tar.gz。在运行过程中可能出现,找不到设备的情况。 curl-7.33.0.tar.gz,需要手动拷贝库,make install不会安装到/...
  • 交叉编译详解 一 概念篇

    万次阅读 多人点赞 2016-10-25 01:00:45
    本文总结了什么是交叉编译链,并介绍了交叉编译链的各个组成部分
  • 嵌入式交叉编译

    千次阅读 2018-08-20 16:18:26
    1、首先将交叉编译工具链添加到环境变量中,执行sudo vi /etc/profile 注:上图中bin/下面的arm…目录下放的是交叉编译工具链,如果不写全的话不能自动补齐。 2、编辑完成后执行source /etc/profile,检查交叉编译...
  • 由于第一次搞嵌入式,交叉编译DirectFB费了一些周折。   首先记录下编译的过程     1 准备源文件包,下载freetype2.4.4和DirectFB-1.4.11.tar.gz,解压。   2 交叉编译安装freetype    export CC=arm-none-...
  • Ubuntu15.04交叉编译opencv到ARM全过程

    千次阅读 2016-09-02 19:06:07
    交叉编译器:arm-none-linux-gnueabi-4.3.2 一、安装交叉编译器 交叉编译器使用飞凌官方提供,将 arm-linux-gcc-4.3.2.tgz 文件拷贝到 Ubuntu 的根 目录下,该文件位于用户基础资料光盘的“实用工具”文件夹中。在...
  • 在Linux环境交叉编译Qt5.5.0源码编译示例 实验环境 交叉编译平台 (on VMware14.0,Win10) 交叉编译链 gcc-linaro-arm-linux-gnueabihf-4.7-2013.03-20130313_linux 前提 得到交叉编译链以及下载Qt5.5.0的源码包 ...
  • 什么是交叉编译

    千次阅读 多人点赞 2017-06-30 09:21:17
    第 1 章 交叉编译简介 1.1 什么是交叉编译 对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用? 在解释什么是交叉编译之前,先要明白什么是本地编译。 本地编译 本地...
  • 一、什么是交叉编译 ...这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操...
  • cmake基础及交叉编译

    千次阅读 2018-05-28 11:42:01
    1. 概念 cmake主要特点: 开放源代码,使用类 BSD 许可发布 跨平台,并可生成 native 编译配置文件,在 Linux/...简化编译构建过程编译过程;Cmake 的工具链非常简单:cmake+make 高效虑,按照 KDE 官方说法...
  • 什么是交叉编译,为什么要使用交叉编译?

    万次阅读 多人点赞 2014-03-04 23:09:47
    这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构(Architecture)、操作系统(OperatingSystem)。同一个体系结构...
  • 上一篇中按照《嵌入式系统软硬件协同设计实战指南》配置之后发现并不好用,这次按照《xilinx zynq soc与嵌入式linux设计实战指南》进行配置一、基本概念:1、交叉编译:在一个平台上上生成另一个平台上可以执行的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,273
精华内容 10,909
关键字:

交叉编译的作用及过程