• 按照海思文档安装完交叉编译器后执行: sudo make CROSS_COMPILE=aarch64-himix100-linux- -j 20 报错: make: aarch64-himix100-linux-gcc: Command...COLLECT_GCC=aarch64-himix100-linux-gcc COLLECT_LTO_WRA..

    按照海思文档安装完交叉编译器后执行:

    sudo make CROSS_COMPILE=aarch64-himix100-linux- -j 20

    报错:

    make: aarch64-himix100-linux-gcc: Command not found

     执行命令又成功:

    aarch64-himix100-linux-gcc -v
    Using built-in specs.
    COLLECT_GCC=aarch64-himix100-linux-gcc
    COLLECT_LTO_WRAPPER=/opt/hisi-linux/x86-arm/aarch64-himix100-linux/host_bin/../libexec/gcc/aarch64-linux-gnu/6.3.0/lto-wrapper
    Target: aarch64-linux-gnu
    Configured with: /home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/src/gcc-6.3.0/configure --build=i386-redhat-linux --host=i386-redhat-linux --target=aarch64-linux-gnu --with-arch=armv8-a --prefix=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install --with-specs='%{!ftree-coalesce-vars:-fno-tree-coalesce-vars}' --disable-libmudflap --disable-libssp --enable-gold=yes --disable-libstdcxx-pch --disable-multilib --enable-multiarch --with-gnu-as --with-gnu-ld --enable-libgomp --enable-gnu-indirect-function --enable-checking=yes --enable-lto --enable-c99 --enable-long-long --disable-nls --enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --enable-shared --with-pkgversion='HC&C V100R002C00B027_20181107' --enable-languages=c,c++ --with-headers=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target/usr/include --with-sysroot=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target --with-build-sysroot=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/target --with-gmp=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-mpfr=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-mpc=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-cloog=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/obj/host-libs/usr --with-build-time-tools=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/aarch64-linux-gnu/bin --libdir=/home/sying/SDK_CPU_UNIFIED/build/script/aarch64-himix100-linux/aarch64_himix100_build_dir/install/lib
    Thread model: posix
    gcc version 6.3.0 (HC&C V100R002C00B027_20181107) 

    如果执行:

    sudo aarch64-himix100-linux-gcc -v

    结果报错:

    sudo: aarch64-himix100-linux-gcc: command not found

    原因:sudo用户为了安全执行的是最小环境变量,没有这个编译器路径

    解决:

    修改文件:/etc/sudoers ,以下语句中加入交叉编译器安装路径,修改后就立即生效

    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin

     

    展开全文
  • 4.gcc和arm-linux-gcc

    2018-12-20 10:45:59
    2.gcc和arm-linux-gcc常用选项 3.gcc编译过程分析 4.静态连接和动态连接 1.gcc和arm-linux-gcc有何不同? 从本质来讲他们都是编译器,而gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是...

    目录

    1.gcc和arm-linux-gcc有何不同?

    2.gcc和arm-linux-gcc常用选项

    3.gcc编译过程分析

    4.静态连接和动态连接


    1.gcc和arm-linux-gcc有何不同?

    从本质来讲他们都是编译器,而gcc是linux系统下面用来将代码编译成一个可执行程序的手段。编译出来的是适用于linux系统的可执行二进制文件。可执行程序其实就是一堆的0101二进制机器码。这些机器码代表什么含义只有机器本身能理解。所以你用gcc编译出来的可执行程序只有在linux系统下面可以运行。
    举个例子
    假设你在Linux系统编译生成了可执行文件,我们本意是要系统打开摄像头,但是如果你在window系统上运行可能就是打开相册。同样的可能这个可执行文件在ARM下面可能是关机。不同系统的机器码含义是不一样的。所以你在linux系统下面写的代码要怎样才能在ARM系统上面跑呢。这就需要用到交叉编译。arm-linux-gcc是什么意思?就是告诉你的编译器,我编写的环境是linux,但是我希望生成的可执行程序是在arm上面跑的。这就是交叉编译。编写环境和执行环境分离的一种手段。

    2.gcc和arm-linux-gcc常用选项

     

    • gcc的使用方法:

    语法:gcc  [选项]   文件名       

    选项与参数  

    -v 查看gcc编译器的版本,显示gcc执行时的详细过程
    -o <file>

    Place the output into <file>

    指定输出文件名为file,这个名称不能跟源文件名同名

    -E Preprocess only; do not compile, assemble or link
    只预处理,不会编译、汇编、链接
    -S Compile only; do not assemble or link
    只编译,不会汇编、链接
    -c  Compile and assemble, but do not link
     编译和汇编,不会链接


     
     

     

     

     

     

     

    例子1:

    1.创建一个hello.c文件,使用gcc编译

    2.使用命令:gcc hello.c直接编译,生成一个a.out的文件

    3.查看文件类型,可以发现是一个可执行文件,直接执行文件a.out,打印输出hello world!

    4.但是这里我们一般使用-O选项指定文件输出的,规定输出的文件名是hello

    使用命令 : gcc -o hello hello.c

    3.gcc编译过程分析

    一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和连接(linking)等 4 步才能变成可执行文件,如表 所示。在日常交流中通常使用“编译”统称这 4 个步骤,如果不是特指这 4 个步骤中的某一个,本书也依惯例使用“编译”这个统称。


    (1)预处理
    C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个“.i”文件中等待进一步处理。预处理将用到 arm-linux-cpp 工具。
    (2)编译
    编译就是把 C/C++代码(比如上述的“.i”文件)“翻译”成汇编代码,所用到的工具为cc1(它的名字就是 cc1,不是 arm-linux-cc1)。
    (3)汇编
    汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在 Linux 系统上一般表现为 ELF 目标文件(OBJ 文件),用到的工具为 arm-linux-as。“反汇编”是指将机器代码转换为汇编代码,这在调试程序时常常用到。
    (4)连接
    连接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件、库文件连接起来,最终生成了可以在特定平台运行的可执行文件,用到的工具为 arm-linux-ld。

     

    例子:

    1.编写一个hello.c文件

    2.对这个文件进行预处理

    使用命令:gcc -E  -o hello.i hello.c

    传回window查看hello.i文件

    可以看到这个文件有800多行,源程序在最后部分

    具体包含了什么东西呢?

    ①数据类型的定义

    在Linux系统中查看这个文件的28行,回到Ubuntu的Linux系统

    使用命令:vim /usr/include/x86_64-linux-gnu/bits/types.h +28

    3.对hello.i文件进行编译

    使用命令:gcc -S -o hello.s hello.i

    传回window系统查看

    4.对编译后的文件hello.s进行汇编(第二步输出的汇编代码hello.s翻译成符合一定格式的机器代码)

    使用命令:gcc  -c -o hello.o hello.s

    注意:

    1):.o:目标文件(Object file,OBJ 文件)

    2):.a:归档库文件(Archive file)

    5.对hello.o文件进行连接连接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件、库文件连接起来,最终生成了可以在特定平台运行的可执行文件

    使用命令:gcc -o hello hello.o

    小结:

    1).在编译过程中,除非使用了 -E, -S, -c选项,或者编译出错,不然最后步骤都是链接。


    例子2:

    简化上边的编译过程:

     

    分别使用命令:

    gcc -c -o hello.o hello.c

    gcc -o hello hello.o

    解释:gcc对.c文件默认的进行预处理操作,-c选项时编译汇编的操作,汇编操作得到.o文件,通过gcc -o hello hello.o命令对hello.o文件进行链接,得到可执行文件。

     


    例子3:

    使用gcc的  -v参数查看系统编译的详细过程

    连接就是将上步生成的 OBJ 文件和系统库的 OBJ 文件库文件连接起来,最终生成了可以在特定平台运行的可执行文件

    分别使用命令:

    gcc -c -o hello.o hello.c

    gcc -v -o hello hello.o

    过程如上图所示。 

    内容如下:

    Using built-in specs.
    COLLECT_GCC=gcc
    COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.4'
     --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ 
     --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib 
     --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ 
     --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new 
     --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib 
     --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre 
     --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64
     --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch 
     --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib 
     --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 
    COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
    LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:
    /lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
    COLLECT_GCC_OPTIONS='-v' '-o' 'hello' '-mtune=generic' '-march=x86-64'
     /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so 
     -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQEwOva.res
     -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s 
     --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o hello 
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o 
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o 
     /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o 
     -L/usr/lib/gcc/x86_64-linux-gnu/5 
     -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu
     -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib 
     -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib 
     -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. hello.o -lgcc 
     --as-needed -lgcc_s  --no-as-needed-lc -lgcc --as-needed -lgcc_s 
     --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o
     /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o

    其中:

    1)加入系统标准启动文件(OBJ文件)

    2)链接库文件(libc)

    在hello.c中使用了printf函数,是在libc中实现的

    注意: -L 是指明链接的路径,-l指明链接的库文件。而-lc:链接libc库文件(里边有实现printf等函数)

    知识点:

    ①gcc使用 -nostartfiles 参数

    表示不连接系统标准启动文件,而标准库文件仍然正常使用

    ②gcc使用 -nostdlib  参数

    表示不连接系统标准启动文件和标准库文件,只是把指定的文件传递给连接器,这个选项常用与编译内核、bootloader等程序,因为他们不需要启动文件和标准库文件。

    验证一下:使用-nostdlib  参数,表示不连接系统标准启动文件和标准库文件,看一下会有什么结果,编译是否成功?

    分别使用命令:

    gcc -c -o hello.o hello.c

    gcc -v -nostdlib -o hello hello.o

    编译的结果如下,提示错误:


    4.静态连接和动态连接

    解析:

    1)动态链接:使用动态链接库进行链接库进行链接,生成的程序在执行的时候需要加载所需要的动态库才能运行,动态连接生成的程序体积体积较小,但是必须依赖所需的动态库,否则无法运行。

    2)静态链接:使用静态库进行链接,生成的程序包含运行所需要的全部库,可以直接运行,不过静态链接生成的程序体积大。

    例子:

    分别使用动态库链接和静态库链接

    查看链接后的文件大小,发现静态链接的文件比动态链接文件大很多

    查看静态链接和静态链接是否需要动态库?

    使用 ldd 命令查看:


     

    展开全文
  • x86-gcc与arm-linux-gcc分别编译运行第一个C/C++程序(附安装详解与C源码文件传输乱码问题) 很多计算机本科生第一次学习嵌入式arm-linux-gcc在linux上编译第一个程序时会遇到诸多问题,本篇教程为入门篇! 我们在...

    嵌入式-x86-gcc与arm-linux-gcc分别编译运行第一个C/C++程序(附安装详解与C源码文件传输乱码问题)

    很多计算机本科生第一次学习嵌入式arm-linux-gcc在linux上编译第一个程序时会遇到诸多问题,本篇教程为入门篇!

    我们在linux上运行x86架构的一个C/C++程序
    首先我们需要安装C/C++的编译器gcc和gcc-c++,由于本人懒得再找一个Ubuntu做实验,就使用本人的阿里云CentOS7服务器做演示吧。
    使用

    #CentOS使用yum或dnf安装gcc和gcc-c++
    yum install gcc gcc-c++ -y
    #Ubuntu使用apt或apt-get安装gcc和gcc-c++
    apt install gcc gcc-c++ -y
    

    在这里插入图片描述
    随便上传一个可执行的C/C++程序
    在这里插入图片描述
    发现有乱码,使用file查看发现是因为程序是在windows上写的,没有使用utf-8字符编码导致的乱码
    在这里插入图片描述
    那就先解决一下这个小bug吧

    #转换汉字编码GB2312UTF-8
    #顺便改一下文件后缀为.c(因为linux上C/C++程序普遍以.c为后缀,但是linux后缀是可有可无的
    #,这里只是辨别一下两个文件)
    iconv -f GB2312 -t UTF-8 conversion.cpp  -o conversion.c
    

    在这里插入图片描述
    再使用file查看文件属性,发现已经为utf-8格式的c文件
    在这里插入图片描述
    接下来编译成x86可执行程序

    #使用gcc编译刚才转换过编码的文件
    gcc -o conversion conversion.c
    #编译没有错误就会生成一个绿色的可执行二进制文件
    

    在这里插入图片描述
    如过有人闲得蛋疼想看一下这个二进制文件也可以,使用xxd命令就可以查看二进制文件
    在这里插入图片描述
    接下来改使用arm-linux-gcc编译一下这个相同的C/C++程序了
    当然第一步还是下载安装,由于官网下载太慢,这里已经下好了arm-linux-gcc4.4.3的包

    #使用tar -zxvf 解压上传的包到当前目录 本人已经事先解压 opt文件夹即是
    tar -zxvf arm-linux-gcc-4.4.3.tar.gz
    

    在这里插入图片描述

    #创建文件夹
    sudo mkdir /usr/local/arm -pv
    #注意我现在所在的位置是在我服务器的/root/c++/opt/FriendlyARM/toolschain/4.4.3
    #你自己的根据自己解压缩的位置进入4.4.3这个文件夹然后执行下面命令
    #拷贝刚才解压的文件到/usr/local/arm目的是为了让linux找到arm-linux-gcc的执行文件
    sudo cp -r `pwd` /usr/local/arm
    

    在这里插入图片描述
    做完上述步骤后

    #执行下面命令配置环境变量
    echo 'export PATH=$PATH:/usr/local/arm/4.4.3/bin' >> /etc/profile |sudo tee -a /etc/profile
    cat /etc/profile | tail -1
    source /etc/profile
    

    在这里插入图片描述
    查看是否配置好环境变量
    如果配置好环境变量则使用table键补全看看会不会出现下面这些
    在这里插入图片描述
    使用arm-linux-gcc编译一下前面的那个C/C++程序

    #使用arm-linux-gcc编译可执行文件
    arm-linux-gcc -o conversion conversion.c
    #使用file命令查看编译二进制文件类型为ARM架构
    file conversion
    #使用./conversion程序无法运行 原因是我们的cpu是x86架构,无法运行arm架构程序
    ./conversion
    

    在这里插入图片描述
    至此演示结束

    对汇编有兴趣可以查看我的上篇文章
    在Linux下运行你的第一个汇编程序

    最后拓展介绍一下arm-linux-gcc
    https://www.cnblogs.com/zhangpengshou/p/3587751.html这篇博客讲的很好,侵删
    我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。
    在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四个阶段:

    1. 预处理(Pre-Processing)

    2. 编译(Compiling)

    3. 汇编(Assembling)

    4. 链接(Linking)
      Linux程序员可以根据自己的需要让 GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为 今后的调试做好准备。和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。
      以文件example.c为例说明它的用法

    5. arm-linux-gcc -o example example.c
      不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。
      -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out

    6. arm-linux-gcc -c -o example.o example.c
      -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.o文件
      去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以

    2.arm-linux-gcc -S -o example.s example.c
    -S参数将对源程序example.c进行预处理、编译,生成example.s文件
    -o选项同上

    3.arm-linux-gcc -E -o example.i example.c
    -E参数将对源程序example.c进行预处理,生成example.i文件(不同版本不一样,有的将预处理后的内容打印到屏幕上)
    就是将#include,#define等进行文件插入及宏扩展等操作。

    4.arm-linux-gcc -v -o example example.c
    加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。

    5.arm-linux-gcc -g -o example example.c
    -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。

    6.arm-linux-gcc -Wall -o example example.c
    -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。

    7.arm-linux-gcc -Ox -o example example.c
    -Ox使用优化选项,X的值为空、0、1、2、3
    0为不优化,优化的目的是减少代码空间和提高执行效率等,但相应的编译过程时间将较长并占用较大的内存空间。

    8.arm-linux-gcc -I /home/include -o example example.c
    -Idirname: 将dirname所指出的目录加入到程序头文件目录列表中。如果在预设系统及当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。

    9.arm-linux-gcc -L /home/lib -o example example.c

    -Ldirname:将dirname所指出的目录加入到库文件的目录列表中。在默认状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后再到系统预设路径中寻找。

    10.arm-linux-gcc –static -o libexample.a example.c

    静态链接库文件

    gcc在命令行上经常使用的几个选项是:
    -c 只预处理、编译和汇编源程序,不进行连接。编译器对每一个源程序产生一个目标文件。

    -o file 确定输出文件为file。如果没有用-o选项,缺省的可执行文件的输出是a.out,目标文件和汇编文件的输出对source.suffix分别是source.o和source.s,预处理的C源程序的输出是标准输出stdout。

    -Dmacro 或-Dmacro=defn 其作用类似于源程序里的#define。例如:% gcc -c -DHAVE_GDBM -DHELP_FILE=“help” cdict.c其中第一个- D选项定义宏HAVE_GDBM,在程序里可以用#ifdef去检查它是否被设置。第二个-D选项将宏HELP_FILE定义为字符串“help”(由于 反斜线的作用,引号实际上已成为该宏定义的一部分),这对于控制程序打开哪个文件是很有用的。

    -Umacro 某些宏是被编译程序自动定义的。这些宏通常可以指定在其中进行编译的计算机系统类型的符号,用户可以在编译某程序时加上 -v选项以查看gcc缺省定义了哪些宏。如果用户想取消其中某个宏定义,用-Umacro选项,这相当于把#undef macro放在要编译的源文件的开头。

    -Idir 将dir目录加到搜寻头文件的目录列表中去,并优先于在gcc缺省的搜索目录。在有多个-I选项的情况下,按命令行上-I选项的前后顺序搜索。dir可使用相对路径,如-I…/inc等。

    -O 对程序编译进行优化,编译程序试图减少被编译程序的长度和执行时间,但其编译速度比不做优化慢,而且要求较多的内存。

    -O2 允许比-O更好的优化,编译速度较慢,但结果程序的执行速度较快。

    -g 产生一张用于调试和排错的扩展符号表。-g选项使程序可以用GNU的调试程序GDB进行调试。优化和调试通常不兼容,同时使用-g和-O(-O2)选项经常会使程序产生奇怪的运行结果。所以不要同时使用-g和-O(-O2)选项。

    -fpic或-fPIC 产生位置无关的目标代码,可用于构造共享函数库。

    以 上是gcc的编译选项。gcc的命令行上还可以使用连接选项。事实上,gcc将所有不能识别的选项传递给连接程序ld。连接程序ld将几个目标文件和库程 序组合成一个可执行文件,它要解决对外部变量、外部过程、库程序等的引用。但我们永远不必要显式地调用ld。利用gcc命令去连接各个文件是很简单的,即 使在命令行里没有列出库程序,gcc也能保证某些库程序以正确的次序出现。

    gcc的常用连接选项有下列几个:
    -Ldir 将dir目录加到搜寻-l选项指定的函数库文件的目录列表中去,并优先于gcc缺省的搜索目录。在有多个-L选项的情况下,按命令行上-L选项的前后顺序搜索。dir可使用相对路径。如-L…/lib等。

    -lname 在连接时使用函数库libname.a,连接程序在-Ldir选项指定的目录下和/lib,/usr/lib目录下寻找该库文件。在没有使用-static选项时,如果发现共享函数库libname.so,则使用libname.so进行动态连接。

    -static 禁止与共享函数库连接。

    -shared 尽量与共享函数库连接

    展开全文
  • arm-linux-gcc常用参数

    2018-04-22 13:07:35
    arm-linux-gcc 参数: 0.arm-linux-gcc -o example example.c  不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。  -o参数用于指定输出的文件,输出文件名为example,如果不指定...

    arm-linux-gcc 参数:

    0.arm-linux-gcc -o example example.c
       不加-c、-S、-E参数,编译器将执行预处理、编译、汇编、连接操作直接生成可执行代码。
       -o参数用于指定输出的文件,输出文件名为example,如果不指定输出文件,则默认输出a.out

    1. arm-linux-gcc -c -o example.o example.c
       -c参数将对源程序example.c进行预处理、编译、汇编操作,生成example.o文件
       去掉指定输出选项"-o example.o"自动输出为example.o,所以说在这里-o加不加都可以

    2.arm-linux-gcc -S -o example.s example.c
       -S参数将对源程序example.c进行预处理、编译,生成example.s文件
       -o选项同上

    3.arm-linux-gcc -E -o example.i example.c
      -E参数将对源程序example.c进行预处理,生成example.i文件
       就是将#include,#define等进行文件插入及宏扩展等操作。
      
    4.arm-linux-gcc -v -o example example.c
    加上-v参数,显示编译时的详细信息,编译器的版本,编译过程等。

    5.arm-linux-gcc -g -o example example.c
    -g选项,加入GDB能够使用的调试信息,使用GDB调试时比较方便。

    6.arm-linux-gcc -Wall -o example example.c
    -Wall选项打开了所有需要注意的警告信息,像在声明之前就使用的函数,声明后却没有使用的变量等。

    7.arm-linux-gcc -Ox -o example example.c
    -Ox使用优化选项,X的值为空、0、1、2、3

    8.arm-linux-gcc –static -o libexample.a example.c
    静态链接库文件

    arm-linux-ld 参数:

    arm-linux-ld -Txxx.lds -o output_elf source_o

    -T指定lds链接脚本 

    -o指定输出文件

    arm-linux-objcopy 参数:

             arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中.此选项可以进行格式的转换.

            在实际编程的,用的最多的就是将ELF格式的可执行文件转换为二进制文件.

    arm-linux-objcopy -O binary -S source_elf output_bin

    -O 输出的格式

    -S 不从源文件中复制重定位信息和符号信息到目标文件中

    arm-linux-objdump 参数:

    arm-linux-objdump -D -m arm xxx.elf > xxx.dis

    -D 显示文件中所有汇编信息

    -m machine (上面-m arm 指定生成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交叉编译工具。可用于交叉编译...

    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/。

    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 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

    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模式。

    技术分享

    交叉编译工具
    参考资料

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

    2017-09-20 08:57:32
    1.arm-linux-gcc编译器: 1)预处理:将C和汇编源程序进行预处理,生成“.i”目标文件 arm-linux-gcc -E -o *.i *.c/*.S 2)编译:将“.i”目标文件编译生成“.s”汇编文件 arm-linux-gcc -S -o *.s *.c ...
  • arm-linux-gcc有诸多选项  arm-linux-gcc -o main main.c 不加-c、-S、-E等参数,则同时进行四个步骤,生成可执行文件。  其中-o mian表示生成的可执行程序的名字为main。  arm-linux-gcc -c -o main.o main....
  • gcc和arm-linux-gcc的常用选项 gcc的使用方法: gcc [选项] 文件名 我们日常生活中所说的编译,其实包含(1)预处理,(2)编译,(3)汇编,(4)链接这四部分 (1)预处理 C/C++源文件中,以#号开头的命令被...
  • 1.arm-none-linux-gnueabi-gcc下载 http://www.veryarm.com/arm-none-linux-gnueabi-gcc arm-none-Linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译...
  • 一、gcc和arm-linux-gcc的常用选项 二、从.c文件到可执行文件过程 一、gcc和arm-linux-gcc的常用选项 常用选型 -v 查看gcc编译器的版本,显示gcc执行时的详细过程 -o Place the output into 指定输出文件名...
  • 我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为四...
  • arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< 总体选项: -c:预处理,编译和汇编源文件,但不做连接,编译器根据源文件生成OBJ文件 -S:编译后停止 -E:预处理后停止 -o file :指定...
  • 所以编译工具arm-linux-gnueabihf-gcc,这个在用static编译选项时对多数程序,除编出来的有点大外都是可用的。但对getpwnam等. Is linking statically (or: bundling all the libraries you need with your ...
  • 交叉编译工具arm-none-linux-gnueabi-gcc安装 ...
  • 下载arm-none-linux-gnueabi-gcc安装包在Ubuntu操作系统中,可以使用自带的wget工具下载arm-none-linux-gnueabi-gcc安装包。 wget是一个非交互式的命令行工具,用于从网络上检索文件并自动下载,支持HTTP、HTTPS、...
  • arm-linux-gcc 常用参数

    2019-06-18 17:29:41
    我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程分为...
  • arm-linux-gcc选项简解

    2017-06-19 20:56:39
    我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程...
  • 本文介绍了在64位Ubuntu下安装arm-linux-gcc-4.4.3的完整方法,介绍了配置PATH环境变量的方法,介绍了解决.arm-none-linux-gnueabi-gcc: not found问题的方法,并且给出了一个测试实例。
  • arm-linux-gcc的总结

    2015-09-24 17:37:53
    关于arm-linux-gcc的总结,本文基于SC2440开发板。来源是《嵌入式完全开发手册》以及博客文章,在此基础上添加补充,也包含个人理解所总结而来的,可能有部分错误,欢迎指正
  • arm-linux-gcc用法

    2018-09-10 21:47:42
    我们需要编译出运行在ARM平台上的代码,所使用的交叉编译器为 arm-linux-gcc。下面将arm-linux-gcc编译工具的一些常用命令参数介绍给大家。 在此之前首先介绍下编译器的工作过程,在使用GCC编译程序时,编译过程...
1 2 3 4 5 ... 20
收藏数 81,338
精华内容 32,535
热门标签