zoukankan      html  css  js  c++  java
  • 编译arm-linux-gcc 4.8.2

    编译gcc 的时候

    主要参考自http://blog.csdn.net/mcy_cool/article/details/17047027

    出于部分原因进行了修改,标红的地方为修改的地方

    编译环境:
        内核名称:Linux
        硬件架构名称:i686
        硬件平台:i386
        操作系统:Ubuntu 13.10
        当前系统gcc版本号:4.8.1

        目标平台OK6410:ARM11

    一、准备工作

    1、下载源码包

    binutils-2.23.1.tar.bz2

    gcc-4.8.2.tar.bz2
    glibc-2.18.tar.bz2
    glibc-linuxthreads-2.5.tar.bz2
    gdb-7.6.1.tar.bz2
    linux-2.6.34.14.tar.xz
    mpfr-3.1.2.tar.bz2
    mpc-1.0.1.tar.gz
    gmp-5.1.3.tar.bz2

    2、准备软件环境
    #apt-get install xz-utils
    #apt-get install m4
    #apt-get install libncurses-dev 
    #apt-get install g++
    #apt-get install gawk

    3、设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要使变量生效)
    #vim ~/.bashrc
        export TARGET=arm-linux-gnueabi
        export PREFIX=/usr/local/arm/4.8.2
        export TARGET_PREFIX=$PREFIX/$TARGET
        export PATH=$PATH:$PREFIX/bin
    #source  ~/.bashrc
    4、为宿主机安装mpfr、mpc、gmp
    #tar -xjvf gmp-5.1.3.tar.bz2
    #cd gmp-5.1.3
    #mkdir build && cd build
    #../configure --prefix=/usr/local/gmp --build=x86_64-linux-gnu
    #make
    #make install

    #tar -xjvf mpfr-3.1.2.tar.bz2
    # cd mpfr-3.1.2
    #../configure --build=x86_64-linux-gnu --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
    #make
    #make install

    #tar -xzvf mpc-1.0.1.tar.gz
    #cd mpc-1.0.1
    #mkdir build && cd build
    #../configure --build=x86_64-linux-gnu --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr
    #make
    #make install
    5、复制linux-kernel-headers
    #xz -d linux-2.6.34.14.tar.xz
    #tar -xvf linux-2.6.34.14.tar
    #cd linux-2.6.34.14
    #make menuconfig
       不做修改,直接退出。
    #make include/linux/version.h
    #mkdir -p $TARGET_PREFIX/include
    #cp -r ./include/linux/ $TARGET_PREFIX/include
    #cp -r ./include/asm-generic/ $TARGET_PREFIX/include
    #cp -r ./arch/arm/include/asm/ $TARGET_PREFIX/include
    接着进入相应目录查看version.h文件是否建立成功。

    二、编译binutils
    #tar -xjvf binutils-2.23.1.tar.bz2
    #cd binutils-2.23.1
    #mkdir build && cd build
    #../configure --prefix=$PREFIX --target=$TARGET
    #make 
    #make install
    完成后,去$PREFIX中检查一下生成的工具。
    # cd $PREFIX/bin
    # ll
    有如下文件:
    arm-linux-addr2line*
    arm-linux-ar*
    arm-linux-as*
    arm-linux-c++filt*
    arm-linux-elfedit*
    arm-linux-gprof*
    arm-linux-ld*
    arm-linux-ld.bfd*
    arm-linux-nm*
    arm-linux-objcopy*
    arm-linux-objdump*
    arm-linux-ranlib*
    arm-linux-readelf*
    arm-linux-size*
    arm-linux-strings*
    arm-linux-strip*
    这些生成的文件的作用分别为:
    arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息
    arm-linux-ar:产生、修改和解开一个存档文件
    arm-linux-as:GNU的汇编器
    arm-linux-c++filt:C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt 就是实现这种反向的转化,根据标号得到函数名
    arm-linux-elfedit:用途暂时未知
    arm-linux-gprof:GNU汇编器预编译器
    arm-linux-ld:GNU的连接器
    arm-linux-ld.bfd:用途暂时未知
    arm-linux-nm:列出目标文件的符号和对应的地址
    arm-linux-objcopy:将某种格式的目标文件转化成另外格式的目标文件
    arm-linux-objdump:显示目标文件的信息
    arm-linux-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中
    arm-linux-readelf:显示 elf 格式的目标文件的信息
    arm-linux-size:显示目标文件各个节的大小和目标文件的大小
    arm-linux-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4
    arm-linux-strip:剥掉目标文件的所有的符号信息

    三、建立初始编译器(不带glibc支持)
    #tar -xjvf gcc-4.8.2.tar.bz2
    重新解压mpfr-3.1.2.tar.bz2、mpc-1.0.1.tar.gz、gmp-5.1.3.tar.bz2,并改名复制至gcc-4.8.2中
    #rm -rf mpfr-3.1.2 mpc-1.0.1  gmp-5.1.3
    #tar -xjvf gmp-5.1.3.tar.bz2
    #mv gmp-5.1.3 gmp
    #mv ./gmp ./gcc-4.8.2
    #tar -xjvf mpfr-3.1.2.tar.bz2
    #mv mpfr-3.1.2 mpfr
    #mv ./mpfr ./gcc-4.8.2
    #tar -xzvf mpc-1.0.1.tar.gz
    #mv mpc-1.0.1 mpc
    #mv ./mpc ./gcc-4.8.2

    #cd gcc-4.8.2
    #mkdir build
    #cd build
    #../configure --prefix=$PREFIX --target=$TARGET --without-headers --enable-languages=c --disable-threads --with-newlib --disable-shared --disable-libmudflap --disable-libssp --disable-decimal-float
    #make all-gcc

    #make install-gcc
    #make all-target-libgcc
    #make install-target-libgcc

    完成之后,$PREFIX/bin下又多了几个文件:
    arm-linux-cpp*
    arm-linux-gcc*
    arm-linux-gcc-4.8.2*
    arm-linux-gcov*
    这些生成的文件的作用分别为:
    arm-linux-cpp:GNU的C的预编译器
    arm-linux-gcc:GNU的C语言编译器
    arm-linux-gcc-4.8.2:GNU的C语言编译器,其实和arm-linux-gcc是一样的
    arm-linux-gcov:gcc 的辅助测试工具,用来分析和优化程序

    四、编译glibc
    Glibc是交叉编译环境的运行库。

    #tar -xvf glibc-2.18.tar.xz
    #tar -xvf glibc-linuxthreads-2.5.tar.bz2 --directory=./glibc-2.18
    # cd glibc-2.18
    # mkdir build
    # cd build
    # CC=$TARGET-gcc
    #export CFLAGS="-g -O2 -march=arm"
    # ln -s /usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc.a /usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc_eh.a
    创建config.cache配置文件
    # vim config.cache
    libc_cv_forced_unwind=yes
    libc_cv_c_cleanup=yes
    libc_cv_arm_tls=yes
    # ../configure --host=$TARGET --target=$TARGET --prefix=$TARGET_PREFIX --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin --with-headers=$TARGET_PREFIX/include CC=$TARGET-gcc CFLAGS=”-g O2 –march-armv6”

    说明:把CC和CFLAGS给修改后将影响到后来编译gcc,导致cc采用arm-linux-gcc而CXX采用g++平台不同出错,其中-march-armv6为6410采用的ARM11指令集
    #make all
    #make install
    五、建立全套编译器(full gcc)
    # cd gcc-4.8.2/build/
    # rm -rf *
    # ../configure --prefix=$PREFIX --target=$TARGET --enable-shared --enable-languages=c,c++  --with-arch=armv6 –with-cpu=arm1176jzf-s –with-tune=arm1176jzf-s –with-fpu=vfp

    说明:6410包含浮点数处理器,编译gcc的时候把它加进去,还有arm11架构是armv6指令集的
    # make
    # make install

    完成之后,$PREFIX/bin下又多了几个文件:
    arm-linux-c++*
    arm-linux-g++*
    这些生成的文件的作用分别为:
    arm-linux-g++:GNU的c++编译器
    arm-linux-c++:等同于arm-linux-g++

    六、编译gdb
    # tar -xvf gdb-7.6.1.tar.bz2

    #./configure --prefix=$PREFIX --target=$TARGET

    说明:红色应该加入,原文有误
    # make
    # make install
    七、创建链接
    # cd $PREFIX/bin
    # ln -s arm-linux-gnueabi-addr2line arm-linux-addr2line
    # ln -s arm-linux-gnueabi-ar arm-linux-ar
    # ln -s arm-linux-gnueabi-as arm-linux-as
    # ln -s arm-linux-gnueabi-c++ arm-linux-c++
    # ln -s arm-linux-gnueabi-c++filt arm-linux-c++filt
    # ln -s arm-linux-gnueabi-cpp arm-linux-cpp
    # ln -s arm-linux-gnueabi-elfedit arm-linux-elfedit
    # ln -s arm-linux-gnueabi-g++ arm-linux-g++
    # ln -s arm-linux-gnueabi-gcc arm-linux-gcc
    # ln -s arm-linux-gnueabi-gcc-4.8.2 arm-linux-gcc-4.8.2
    # ln -s arm-linux-gnueabi-gcov arm-linux-gcov
    # ln -s arm-linux-gnueabi-gdb arm-linux-gdb
    # ln -s arm-linux-gnueabi-gdbtui arm-linux-gdbtui
    # ln -s arm-linux-gnueabi-gprof arm-linux-gprof
    # ln -s arm-linux-gnueabi-ld arm-linux-ld
    # ln -s arm-linux-gnueabi-ld.bfd arm-linux-ld.bfd
    # ln -s arm-linux-gnueabi-nm arm-linux-nm
    # ln -s arm-linux-gnueabi-objcopy arm-linux-objcopy
    # ln -s arm-linux-gnueabi-objdump arm-linux-objdump
    # ln -s arm-linux-gnueabi-ranlib arm-linux-ranlib
    # ln -s arm-linux-gnueabi-readelf arm-linux-readelf
    # ln -s arm-linux-gnueabi-run arm-linux-run
    # ln -s arm-linux-gnueabi-size arm-linux-size
    # ln -s arm-linux-gnueabi-strings arm-linux-strings
    # ln -s arm-linux-gnueabi-strip arm-linux-strip
    八、验证
    使用vim编写一个简单文件,这里以hello.c为例(程序略):

    然后执行编译命令:
    # arm-linux-gcc -static hello.c –o hello
    编译完成后验证最终编译出的文件。实例:
    # file hello 
    hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.0.0, not stripped
    有如上输出表示编译ARM版本程序成功。

    至此完成。

    针对6410的gcc设置

    http://www.arm9home.net/simple/index.php?t7832.html

    http://www.crifan.com/find_s3c6410_march_macpu_mtune_mfpu_mfloat_abi/,原理正确,配置有问题,还是参照上面地址中

    Ubuntu11.04中搭建交叉编译环境(arm-linux-gcc-4.6.1版本),http://my.oschina.net/u/225867/blog/38473

  • 相关阅读:
    关于向量叉积求得法向量方向判断
    Winform菜单之ContextMenuStrip
    Winform菜单之Menustrip
    MDI窗体及涉及到的相关问题
    Winform主窗体的设置
    Winform登录、控制软件只运行一次、回车登录
    MessageBox详解
    Winform窗体
    Winform创建解决方案
    Winform开发入门集中培训系列文章
  • 原文地址:https://www.cnblogs.com/linshangyao/p/3854149.html
Copyright © 2011-2022 走看看