zoukankan      html  css  js  c++  java
  • 使用crosstool-ng制作交叉编译工具链【转】

    转自:https://blog.csdn.net/lisemi/article/details/91045791

    一、安装crosstool-ng

    1、获取crosstool-ng

    从官网(http://crosstool-ng.org/)下载crosstool-ng,注意要下载官网打包好的版本,如果直接从github下载源码,源码版本主目录没有configure文件,无法配置和编译。

    2、编译crosstool-ng

           解压进入crosstool-ng目录,执行./configure,make,sudo make install,在configure的过程会出现很多依赖库没有,直接使用apt-get命令安装对应的依赖库即可,这里需要注意的是本人在使用apt-get命令安装libtool库的时候,提示已经安装好,但是configure时还是提示没有,此时同时下载libtool库离线安装解决此问题。安装好crosstool-ng会在/usr/local对应的目录下。

    3、测试

           ct-ng –v出现对应的版本信息则表示安装成功。

     

    二、制作编译器

    在制作交叉编译工具之前,首先对其命名规则和类型进行简单说明。

    • 交叉编译工具链命名规则:arch [-vendor] [-os] [-(gnu)eabi]
    1. arch - 体系架构,如ARM,MIPS
    2. verdor - 工具链提供商
    3. os - 目标操作系统
    4. eabi - 嵌入式应用二进制接口
    • 不同交叉编译工具链简单说明:
    1. arm-none-eabi:没有操作系统的,不支持那些跟操作系统关系密切的函数(Glibc),使用嵌入式newlib专用库,常用于编译ARM7、Contex-M和contex-R系统的arm裸机系统(boot,kernel),不能编译应用软件。
    2. arm-none-linux-eabi:指定linux系统,使用Glibc
    3. arm-none-linux-gnueabi-gcc 主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。使用Glibc,经过Codesourcery公司优化。
    4. arm-eabi-gcc:android ARM编译器
    5. arm-none-uclinuxeabi: 用于uCLinux,使用Glibc。
    6. arm-none-symbianelf: 用于symbian。
    • ABI 和 EABI的区别
    1. ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类

    型)和操作系统之间或其他应用程序的低级接口。

    1. EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。
    2. 两者主要区别,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。
    • arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc:

    两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,只是armel 和 armhf 这两种架构在对待浮点运算采取不同的策略。他们其实只是在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中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

     

    1、获取工具类型

    (1)建立一个制作交叉编译工具的目录crosstool

    (2)ct-ng list-samples查看crosstoll-ng工具支持制作哪些工具模块,如下图所示:

     

    这里选择arm-unknown-linux-gnueabi,通过执行ct-ng arm-unknown-linux-gnueabi命令生成对应的config文件。Config以隐藏文件.config方式在当前的目录生成。

     

     

    2、配置

           执行ct-ng menuconfig命令进入配置页面

    1)路径配置:

          

     

    • Local tarballs directory:指定制作编译器所需要的源码包的下载存放(一般下载会很慢,可以在编译之前将需要的源码包下载好放在该目录里,或者在http://ftp.gnu.org/gnu/下载),可以修改成任意位置,请提前建好并注意权限。这里指定到crosstool/src下。
    • Prefix directory:制作好的交叉编译器所放置的目录。
    • Debug crosstool-NG:选择Debug crosstool-NG,会多出一个子菜单,选中Save intermediate steps,此选项提供一个从上一步错误的地方继续编译,而不是从新编译,这样节约大量的时间。
    • Number of parallel jobs:这个菜单需要下拉才能看到此项为增加编译时的并行进程数,以增加运行速度,加速编译。如选择三个进程:选择(3)Number of parallel jobs。

          2)平台配置

          进入Target option

           

     

    • Target Architecture:这个选择arm架构;
    • Architecture level:Architecture level=CT_ARCH_ARCH=-march,指CPU指令集架构,这里选择ARMv7
    1. ARMv4t- ARMv8t
    2. ARM920t
    3. 其他可以查arm芯片资料,可查到对应的架构
    • Emit assembly for CPU:Emit assembly for CPU=CT_ARCH_CPU=-mcpu。cpu核心,如Contex-A7
    • Tune for CPU:Tune for CPU=CT_ARCH_TUNE=-mtune。哪一款CPU。
    • Use specific FPU:FPU处理器,VFP或neon等。
    • Floating point:浮点运算类型,软浮点或硬浮点

    说明:具体都支持哪些架构呢?可以用man gcc来查询,搜索arm,再搜索-march=就可以找到本gcc支持的处理器核心列表了。

          3)工具链配置

            进入Toolchain option

            

     

    • Tuple's vendor string:供应商字符串,若设置为abc,则编译后的工具链名字为arm-abc-linux-gnueabi。
    • Tuple's alias:工具链的别名,若设置为arm-linux,则编译后会建立工具链的软连接,命名为arm-linux-xx。
    1. 其他配置

    进入Operating System --->菜单。选择编译的内核版本。这里使用默认的参数;

    进入Binary utilities --->选择binutils的源码包版本号,配置二进制工具。这里使用默认参数。

    C-library --->菜单,选择glibc库版本,使用默认参数

    C compiler --->菜单选择GCC版本,选择默认参数

    Debug facilities --->菜单,选择调试工具版本,默认参数。

    Companion libraries --->菜单,编译工具,GMP是实现任意精度算术运算的软件包,可以完成有符号整数、有理数和浮点数的运算。只要计算机的内存满足需求,GMP的运算精度没有任何限制。MPFR是一个用于高精度浮点运算的C库。默认参数

    3、编译

           执行ct-ng build开始编译

     

    三、编译常见问题

    1)安装到cross-gdb时,出现configure: error: expat is missing or unusable,expat-2.1.0.tar.gz这个文件是运行build时它自己下载的。解决:sudo apt-get install libexpat1-dev.

    2)解决完问题1后执行ct-ng cross-gdb+可以接着前面的编译。又出现了_123136.c:835:15: error: expected ')' before 'int'的错误。在网上搜寻答案。解决:export CPPFLAGS="-P"。

    3)error: forced unwind support is required的错误,选中C库选项的Force unwind support即可。

    4)Error happened in: CT_DoExecLog[scripts/functions@257],在当前编译目录下,找到.build文件夹,除了tarballs和tools文件夹,其他的文件夹都删除

    5)included file 'linux/if_pppolac.h' is not exported 解决方法: Disable kernel header check。

    6)Build failed in step 'Installing pass-1 core C gcc compiler',没有找到具体原因,通过更改gcc的版本避免。

    7)Don't set LD_LIBRARY_PATH. It screws up the build。直接执行unset LD_LIBRARY_PATH即可。

    8)Error happened in: do_libc_get[scripts/build/libc/newlib.sh@741]。查看build.log发现是下载newlib库失败,再看发现下载的版本是2.2.0,该版本对应的官网没有,因此我直接进入.config修改成2.0.0版本即可。

    【作者】张昺华
    【大饼教你学系列】https://edu.csdn.net/course/detail/10393
    【新浪微博】 张昺华--sky
    【twitter】 @sky2030_
    【微信公众号】 张昺华
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    协程基础及其创建和使用方法
    创建进程池与线程池concurrent.futures模块的使用
    线程队列queue的使用
    线程操作之锁的使用
    linux内核调试指南
    在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying
    LPC1788 SDRAM运行程序
    Altium designer 原理图库快速创建
    NFS挂载启动
    网站记录
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/13498054.html
Copyright © 2011-2022 走看看