在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc

Linux系统:Ubuntu 18.04.1 LTS amd64
编译平台:Ubuntu 14.04.4 LTS
crosstool-ng-1.23.0
一、 下载安装crosstool-ng
1、 从crosstool-ng官网或github上下载最新版本。
wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第1张图片
2、 解压源码,进入源码目录:
tar -jxvf crosstool-ng-1.23.0.tar.bz2
cd crosstool-ng-1.23.0
在这里插入图片描述
3、 安装编译依赖包
sudo apt-get install sed bash dpkg-dev bison flex patch texinfo automake m4 libtool cvs tar gzip bzip2 lzma libncurses5-dev bison flex texinfo automake libtool patch cvs cvsd gperf help2man gawk
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第2张图片
4、 执行编译三部曲
./configure --prefix=/opt/crosstool-ng
make
sudo make install
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第3张图片
有提示,解决如下:
5、 配置环境变量:
echo “PATH=$PATH:/opt/crosstool-ng/bin” >> ~/.bashrc
source ~/.bashrc
在这里插入图片描述

测试是否安装成功:
ct-ng –v
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第4张图片
成功。
二、 配置交叉编译工具链
1、 创建目录:交叉工具链的输出目录,保存源码包目录,交叉编译器的安装路径:
mkdir crosstool-build src x-tools
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第5张图片
将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到交叉工具链的输出目录crosstool-build下
cp /opt/crosstool-ng/lib/crosstool-ng-1.23.0/samples/arm-unknown-linux-gnueabi/crosstool .config
在这里插入图片描述
2、 执行ct-ng menuconfig进入配置界面
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第6张图片
设定源码包路径和交叉编译工具链的安装路径
Paths and misc options—>
激活 ‘Try features marked as EXPERIMENTAL’ 选项
( H O M E / a r m − l i n u x − t o o l s / s r c ) L o c a l t a r b a l l s d i r e c t o r y ( {HOME}/arm-linux-tools/src) Local tarballs directory ( HOME/armlinuxtools/src)Localtarballsdirectory({HOME}/crosstool-ng/x-tools) Prefix directory
修改交叉编译工具针对的架构(S3C6410)
Target options—>
Target architecture(arm)
Endianness(Little endian)
Bitness(32-bit)
(armv6zk) Architecture level
(arm1176jzf-s) Emit assembly for CPU
Floating point(hardware FPU)
其它选项用缺省值,退出并保存配置工具
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第7张图片

在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第8张图片
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第9张图片
3、 执行ct-ng build编译工具链
ct-ng build
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第10张图片
报错,是因为内存不足,关闭虚拟机,设置运行内存为4GB,问题解决。
再次在crosstool-build下执行 ct-ng build
在这里插入图片描述
再次报错,打开ubsan.c 1474行修改源码:
.build文件夹属于隐藏文件夹,所以重命名之后再操作。
if (xloc.file == NULL || strncmp (xloc.file, “\1”, 2) == 0
|| xloc.file == ‘\0’ || xloc.file[0] == ‘\xff’
|| xloc.file[0] == ‘\0’ || xloc.file[0] == ‘\xff’
|| xloc.file[1] == ‘\xff’)
return false;
再次执行ct-ng build
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第11张图片
至此,全部安装成功。
4、 添加环境变量:
echo “PATH= P A T H : PATH: PATH:HOME/arm-linux-tools/x-tools/bin” >> ~/.bashrc
source ~/.bashrc
在这里插入图片描述
5、 测试是否安装成功
arm-unknown-linux-gnueabihf-gcc –v
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第12张图片
三、 改名:
arm-unknown-linux-gnueabihf-这样的命令不方便使用,我们希望是arm-linux-gcc这样的形式。通过shell脚本完成。
sudo vim link.sh
内容如下:
#!/bin/sh
PREFIX=arm-unknown-linux-gnueabihf-
AFTFIX=arm-linux-
ln -s ${PREFIX}gcc ${AFTFIX}gcc
ln -s ${PREFIX}addr2line ${AFTFIX}addr2line
ln -s ${PREFIX}ar ${AFTFIX}ar
ln -s ${PREFIX}as ${AFTFIX}as
ln -s ${PREFIX}c++ ${AFTFIX}c++
ln -s ${PREFIX}c++filt ${AFTFIX}c++filt
ln -s ${PREFIX}cpp ${AFTFIX}cpp
ln -s ${PREFIX}g++ ${AFTFIX}g++
ln -s ${PREFIX}gcov ${AFTFIX}gcov
ln -s ${PREFIX}gdb ${AFTFIX}gdb
ln -s ${PREFIX}gprof ${AFTFIX}gprof
ln -s ${PREFIX}ld ${AFTFIX}ld
ln -s ${PREFIX}ldd ${AFTFIX}ldd
ln -s ${PREFIX}nm ${AFTFIX}nm
ln -s ${PREFIX}objcopy ${AFTFIX}objcopy
ln -s ${PREFIX}objdump ${AFTFIX}objdump
ln -s ${PREFIX}populate ${AFTFIX}populate
ln -s ${PREFIX}ranlib ${AFTFIX}ranlib
ln -s ${PREFIX}readelf ${AFTFIX}readelf
ln -s ${PREFIX}size ${AFTFIX}size
ln -s ${PREFIX}strings ${AFTFIX}strings
ln -s ${PREFIX}strip ${AFTFIX}strip
ln -s ${PREFIX}cc ${AFTFIX}cc
ln -s ${PREFIX}dwp ${AFTFIX}dwp
ln -s ${PREFIX}elfedit ${AFTFIX}elfedit
ln -s ${PREFIX}gcc-6.3.0 ${AFTFIX}gcc-6.3.0
ln -s ${PREFIX}gcc-ar ${AFTFIX}gcc-ar
ln -s ${PREFIX}gcc-nm ${AFTFIX}gcc-nm
ln -s ${PREFIX}gcc-ranlib ${AFTFIX}gcc-ranlib
ln -s ${PREFIX}gcov-tool ${AFTFIX}gcov-tool
ln -s ${PREFIX}ld.bfd ${AFTFIX}ld.bfd
ln -s ${PREFIX}ld.gold ${AFTFIX}ld.gold
:wq!
sudo sh link.sh
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第13张图片
成功!
四、 测试
在/usr/yjp/目录下创建文件夹arm-linux-gcc并进入,用来保存源码:
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第14张图片
创建hello.c
touch hello.c
在这里插入图片描述
编辑hello.c
vi hello.c
#include
int main(){
printf(“Hello Embedded!”);
return 0;
}
保存退出
编译:arm-linux-gcc –c hello.c
链接:arm-linux-gcc –o hello hello.o
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第15张图片
将hello可执行文件下载到开发板上运行:
在Ubuntu16.04下从源码编译交叉编译工具链arm-linux-gcc_第16张图片
至此全部结束。

参考文章:https://www.jianshu.com/p/a513590de6b8

你可能感兴趣的:(嵌入式Linux学习)