• 交叉编译工具链的制作


    交叉编译工具链的制作

    前言及准备

    本笔记制作的交叉编译工具已通过简单验证,对初次有需求需要搭建交叉工具链有一定的指导意义,制作工具链比较耗时,需做好花费一整天时间的准备。

    资料学习链接

    crosstool-ng详解

    linux工具、软件安装的基本步骤:

    下载,配置,编译,安装

    crosstool-ng下载

    crosstool-ng-1.23.0.tar.bz2

    或使用指令

    新建 arm-linux-tool 文件夹用于制作工具链

    mkdir arm-linux-tool
    cd arm-linux-tool
    wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2
    tar -xvjf crosstool-ng-1.23.0.tar.bz2
    

    新建

    mkdir crosstool-build crosstool-install src
    

    一、安装crosstool-ng

    1.编译依赖

    sudo apt-get install gperf flex bison texinfo gawk libtool automake libncurses5-dev g++ help2man
    

    gperf是完美哈希函数生成器;

    bison和flex是用来生成语法和词法分析器;

    texinfo和man类似,用来读取帮助文档;

    automake是帮助生成Makefile的工具;

    libtool帮助在编译过程中处理库的依赖关系,自动搜索路径;

    gawk是linux下用于文本处理和模式匹配的工具;

    2.配置、安装

    cd crosstool-ng-1.23.0
    ./configure --prefix /home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/
    

    配置过程中出现的缺少安装项通过安装解决
    在这里插入图片描述

    配置正常生成 makefile 后,进行编译安装

    在这里插入图片描述

    make
    make install
    

    验证安装是否成功

    在 crosstool-install/bin 目录下执行 ./ct-ng -v

    在这里插入图片描述

    为了后面使用方便,配置临时环境变量

    export PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/crosstool-install/bin/
    

    二、配置交叉编译工具链

    对于常见的架构,比如arm,mips,powerpc等等,都有了很多的,已经帮我验证过,可以正常编译的示例配置了,所以我们接下来,主要就是:

    搞懂自己借用哪个配置,然后调用默认配置,然后再确认一下配置,根据自己的情况去改一改,就差不多,就配置好了。

    下面介绍,如何去配置crosstool-ng的主要的两种情况:

    • 如果已有同样(类似的)配置,那么直接拿过来用即可
    • 如果没有需要的配置,则找到一个最为接近的配置,借用后,再去修改为自己所要的配置

    在 crosstool-ng 源码的 crosstool-ng-1.23.0/samples 目录下已经提供了很多配置模板,我们基于模板修改。

    拷贝 crosstool-ng-1.23.0/samples/arm-unknown-linux-gnueabi 到 crosstool-build文件夹;

    复制 arm-unknown-linux-gnueabi/crosstool.config 为 .config用来配置

    cd crosstool-build
    cp arm-unknown-linux-gnueabi/crosstool.config .config
    ct-ng menuconfig
    

    (1)Paths and misc options 配置选项

    设定源码包路径和交叉编译器的安装路径

    • 源码包路径:设置Paths and misc options下的Local tarballs directory为 /home/wangh/workspace/wh_tools/arm-linux-tool/src
    • 交叉编译器的安装路径:设置Paths and misc options下的Prefix directory为 /home/wangh/workspace/wh_tools/arm-linux-tool/x-tools/${CT_TARGET}

    在这里插入图片描述
    在这里插入图片描述

    (2)Target options 配置选项

    1.修改交叉编译器针对的架构

    • 设置Target options下的Architecture level为 armv7-a

    • 设置Target options下的Emit assembly for CPU为 cortex-a7

    • 设置Target options下的Tune for CPU为 cortex-a7

      在这里插入图片描述

      iMX6ULL配置如下:

    • Architecture level=CT_ARCH_ARCH=-march=armv7-a //架构

    • Emit assembly for CPU=CT_ARCH_CPU=-mcpu=cortex //家族

    • Tune for CPU=CT_ARCH_TUNE=-mtune=cortex-a7 //内核

    ​ iMX283配置如下:

    • Architecture level=CT_ARCH_ARCH=-march=armv5tej //架构
    • Emit assembly for CPU=CT_ARCH_CPU=-mcpu=arm9e //家族
    • Tune for CPU=CT_ARCH_TUNE=-mtune=arm926ej-s //内核

    2.设置支持硬件 FPU,iMX6ULL 支持硬件浮点运算单元

    在这里插入图片描述

    (3)Toolchain options 配置选项

    1.修改 Tuple’s vendor string 厂商字符串 如:arm-fsl-linux-gnueabi-

    我们用 ht 或自定义,这里我用 wh 标识

    在这里插入图片描述

    1. 修改 Tuple’s alias ,给交叉编译工具起别名,这样会给每个工具创建一个软连接

    这样 arm-wh-linux-guneabihf-gcc 就可以使用 arm-linux-gcc 表示。

    在这里插入图片描述

    (4)Operating System 配置选项

    1.使用本地内核,配置内核版本与路径

    修改 Path to custom source, tarball or directory 为/home/wangh/Tools/linux-4.1.15

    修改自定义内核版本为 4.1.15
    在这里插入图片描述

    (5)C-library 配置选项

    在这里插入图片描述

    其他先保持默认。

    做完上述配置工作后,选择save然后退出。

    执行 ct-ng build

    整个编译过程时间比较长,crosstool-ng 会自动下载相应的包(没有配置本地内核的还需要下载内核文件),然后解压、配置、编译、链接,但有个别包在自动下载过程中会出错,如:libelf-0.8.13,这个时候就需要手动下载,然后放到之前设置的 arm-linux-tool/src 目录下,重新运行 ct-ng build 即可。

    编译出错

    1. Building binutils 时出现 g++: internal compiler error: Killed (program cc1plus) 错误,经查询可能是内存不足, 临时使用交换分区来解决。

      sudo dd if=/dev/zero of=/swapfile bs=64M count=16
      sudo mkswap /swapfile
      sudo swapon /swapfile
      

      编译完成之后释放资源

      sudo swapoff /swapfile
      sudo rm /swapfile
      
      
    2. 其他不太好查询的错误可查看目录下的编译日志,会有出错的具体原因,如配置Emit assembly for CPU为 cortex 导致编译gcc时出现无法识别的错误,修改为cortex-a7即可。

    整个编译过程时间较长,视电脑配置,配置好12小时,差一点的34小时,当然编译出错再次编译也会浪费大量时间,做好需要花费1~2天时间的准备。

    编译完成

    经过几次修改和漫长的编译终于编译完成。

    在这里插入图片描述

    配置环境变量

    echo "PATH=$PATH:/home/wangh/workspace/wh_tools/arm-linux-tool/x-tools/arm-wh-linux-gnueabihf/bin" >> ~/.bashrc
    source ~/.bashrc 
    
    

    安装成功测试

    arm-linux-gcc --version
    
    

    在这里插入图片描述

    三、工具编译测试

    1.写一个简单的C程序, hello.c

    #include<stdio.h>
    #include<stdlib.h>
    
    static char buff[256];
    static char* string;
    
    int main (void)
    {
    	string = buff;
    	printf("Please input a string: ");
    	fgets(string, 256, stdin);
    	printf("Your string is: %s", string);
    
    	return 0;
    } 
    
    

    2.使用配置的工具链交叉编译

    arm-linux-gcc hello.c -o hello
    
    

    在这里插入图片描述

    3.nfs共享到目标板上执行

    在这里插入图片描述

  • 相关阅读:
    android stagefright awesomeplayer 分析
    stagefright框架(七)-Audio和Video的同步
    stagefright框架(六)-Audio Playback的流程
    Windows Sockets Error Codes
    编译boost (windows msvc14)
    golang windows程序获取管理员权限(UAC ) via gocn
    阿里云容器服务--配置自定义路由服务应对DDOS攻击
    store / cache 系列
    一些项目感悟
    protobuf-3.0.0-beta-2 windows编译 x64/x86
  • 原文地址:https://www.cnblogs.com/silencehuan/p/11531801.html
Copyright © 2020-2023  润新知