centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

1.编译交叉编译工具

下载源码并编译安装,地址:http://crosstool-ng.org/download/crosstool-ng/

tar xvf crosstool-ng-1.24.0.tar.xz

安装依赖的包
yum install gcc-c++
yum install gperf
yum install bison
yum install flex
yum install texinfo
yum install help2man
yum install patch
yum install ncurses-devel

./configure --prefix=/usr/local/crosstool-1.24.0
然后make && make install

设置PATH
export PATH=/usr/local/crosstool-1.24.0/bin:$PATH

这样交叉编译工具ct-ng就编译好了

2.搭建交叉编译工具

创建用户niuhe,因为ct-ng工具不能用root用户去使用

创建存放制作交叉编译环境的目录
mkdir -p /home/niuhe/crosstool-23/build  src  x-tools
src存放下载下来的源码
x-tools存放编译好的交叉编译环境
build为编译的目录

 

接下来就可以开始制作arm64交叉编译工具链

首先,我们可以查看当前版本的有哪些模板样例,执行如下命令:

ct-ng list-samples

输出:

Status Sample name
[G...] aarch64-rpi3-linux-gnu
[G..X] aarch64-unknown-linux-android
[G...] aarch64-unknown-linux-gnu
[G...] aarch64-unknown-linux-uclibc
[G...] alphaev56-unknown-linux-gnu
[G...] alphaev67-unknown-linux-gnu
[G...] arc-arc700-linux-uclibc
[G...] arc-multilib-elf32
[G...] arc-multilib-linux-uclibc
[G...] arm-bare_newlib_cortex_m3_nommu-eabi
[G...] arm-cortex_a15-linux-gnueabihf
[G..X] arm-cortexa5-linux-uclibcgnueabihf
[G...] arm-cortex_a8-linux-gnueabi
[G..X] arm-cortexa9_neon-linux-gnueabihf

......

进入build目录
执行ct-ng aarch64-unknown-linux-gnu
执行ct-ng menuconfig,进入界面配置指定源码路径及交叉编译安装路径及各种源码及版本
会在build目录下生成.config配置文件

主界面:

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

Paths and misc options选项指定

源码路径:/home/niuhe/crosstool-24/src

build目录:/home/niuhe/crosstool-24/build

安装目录:/home/niuhe/crosstool-24/x-tools

Number of parallel jobs选项设置,编译线程数:8

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

C-library选项指定

glibc版本:2.17

这里默认指定2.28,编译glibc时报:

*** These critical programs are missing or too old: make
*** Check the INSTALL file for required versions.

意思make版本过旧,后来设置glibc的版本2.17,编译通过。

报错实际上是glibc源码的configure文件的5301 5302行:
5301 *** These critical programs are missing or too old:$critic_missing
5302 *** Check the INSTALL file for required versions." "$LINENO" 5

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

C compiler选项指定

编译器选项指定gcc版本7.4

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

Debug facilitier选项指定

这里指定了gdb(去掉了Enable python scripting选项,否则报找不到/usr/bin/python27,但实际上有安装python2.7),和strace;这两个指不指定其实没所谓

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

Companion tools选项指定

指定autoconf2.69和libtool2.4.6

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

其他,都用aarch64-unknown-linux-gnu模板的默认选项

然后ct-ng build编译,因为没有联网,会报下载各个源码失败的错误。

依次下载对应的源码:

-rw-rw-r--. 1 niuhe niuhe   1977576 Feb 26 14:13 make-4.2.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2006643 Feb 26 14:23 m4-1.4.18.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2300906 Feb 26 14:25 automake-1.16.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe 161197451 Feb 26 14:39 linux-4.20.8.tar.gz
-rw-rw-r--. 1 niuhe niuhe    607698 Feb 26 14:45 zlib-1.2.11.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2386766 Feb 26 15:22 gmp-6.1.2.tar.bz2
-rw-rw-r--. 1 niuhe niuhe   2211910 Feb 26 15:26 mpfr-4.0.2.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2036201 Feb 26 15:38 isl-0.20.tar.gz
-rw-rw-r--. 1 niuhe niuhe    701263 Feb 26 15:40 mpc-1.1.0.tar.gz
-rw-rw-r--. 1 niuhe niuhe    513322 Feb 26 15:49 expat-2.2.6.tar.bz2
-rw-rw-r--. 1 niuhe niuhe   3365395 Feb 26 16:22 ncurses-6.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe   5264188 Feb 26 16:30 libiconv-1.15.tar.gz
-rw-rw-r--. 1 niuhe niuhe  19704011 Feb 26 16:43 gettext-0.19.8.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe 112420370 Feb 26 16:56 gcc-7.4.0.tar.gz
-rw-rw-r--. 1 niuhe niuhe   1444216 Mar  1 16:12 strace-4.26.tar.xz
-rw-rw-r--. 1 niuhe niuhe   1214744 Mar  1 16:17 autoconf-2.69.tar.xz
-rw-rw-r--. 1 niuhe niuhe    973080 Mar  1 16:19 libtool-2.4.6.tar.xz
-rw-rw-r--. 1 niuhe niuhe  20170388 Mar  1 16:25 gdb-8.2.1.tar.xz
-rw-rw-r--. 1 niuhe niuhe  19886772 Mar  1 17:17 binutils-2.29.1.tar.xz
-rw-rw-r--. 1 niuhe niuhe  10981956 Mar  1 17:20 glibc-2.17.tar.xz

然后,编译完成,aarch64架构的编译环境包括gcc include头文件 库文件等就会生成到x-tools目录下
将/home/niuhe/crosstool-24/x-tools/bin加到PATH环境变量

3验证

查看gcc版本:

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

编译helloword,并查看依赖,及readelf

运行时在x86_64环境运行不了

aarch64-unknown-linux-gnu-g++ helloword_arm.cc -o helloword_arm
aarch64-unknown-linux-gnu-ldd --root /home/niuhe/crosstool-24/x-tools/aarch64-unknown-linux-gnu/sysroot/lib helloword_arm
readelf -h helloword_arm

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

在arm64架构下运行:

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

编译gcc4.8.5

gcc4.8.5依赖isl版本低于0.15,否则编译报错:

gcc7.3.0依赖isl0.15版本

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

gcc4.8.5新增依赖cloog,变更linux内核3.10.108

[niuhe@GFS-CentOS76 src]$ ls -lrt
total 525904
-rw-rw-r--. 1 niuhe niuhe   1977576 Feb 26 14:13 make-4.2.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2006643 Feb 26 14:23 m4-1.4.18.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2300906 Feb 26 14:25 automake-1.16.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe 161197451 Feb 26 14:39 linux-4.20.8.tar.gz
-rw-rw-r--. 1 niuhe niuhe    607698 Feb 26 14:45 zlib-1.2.11.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2386766 Feb 26 15:22 gmp-6.1.2.tar.bz2
-rw-rw-r--. 1 niuhe niuhe   2211910 Feb 26 15:26 mpfr-4.0.2.tar.gz
-rw-rw-r--. 1 niuhe niuhe   2036201 Feb 26 15:38 isl-0.20.tar.gz
-rw-rw-r--. 1 niuhe niuhe    701263 Feb 26 15:40 mpc-1.1.0.tar.gz
-rw-rw-r--. 1 niuhe niuhe    513322 Feb 26 15:49 expat-2.2.6.tar.bz2
-rw-rw-r--. 1 niuhe niuhe   3365395 Feb 26 16:22 ncurses-6.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe   5264188 Feb 26 16:30 libiconv-1.15.tar.gz
-rw-rw-r--. 1 niuhe niuhe  19704011 Feb 26 16:43 gettext-0.19.8.1.tar.gz
-rw-rw-r--. 1 niuhe niuhe 112420370 Feb 26 16:56 gcc-7.4.0.tar.gz
-rw-rw-r--. 1 niuhe niuhe   1444216 Mar  1 16:12 strace-4.26.tar.xz
-rw-rw-r--. 1 niuhe niuhe   1214744 Mar  1 16:17 autoconf-2.69.tar.xz
-rw-rw-r--. 1 niuhe niuhe    973080 Mar  1 16:19 libtool-2.4.6.tar.xz
-rw-rw-r--. 1 niuhe niuhe  20170388 Mar  1 16:25 gdb-8.2.1.tar.xz
-rw-rw-r--. 1 niuhe niuhe  19886772 Mar  1 17:17 binutils-2.29.1.tar.xz
-rw-rw-r--. 1 niuhe niuhe  10981956 Mar  1 17:20 glibc-2.17.tar.xz
-rw-rw-r--. 1 niuhe niuhe  73489452 Mar  4 10:38 linux-3.10.108.tar.xz
-rw-rw-r--. 1 niuhe niuhe   1406988 Mar  4 10:41 isl-0.15.tar.xz
-rw-rw-r--. 1 niuhe niuhe   4796456 Mar  4 10:46 cloog-0.18.4.tar.gz
-rw-rw-r--. 1 niuhe niuhe  86165587 Mar  4 10:48 gcc-4.8.5.tar.bz2
-rw-rw-r--. 1 niuhe niuhe   1247052 Mar  4 11:30 isl-0.14.tar.xz

去掉strace,4.26版本,编译报错:
centos7.6通过crosstool-ng编译搭建arm64交叉编译环境
4.5.18版本,也编译不过,没有啥影响就不找了。

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

将编译后的安装目录变更为:/home/niuhe/crosstool-24/gcc4.8.5

与原.config比对大致差异:

centos7.6通过crosstool-ng编译搭建arm64交叉编译环境

编译arm64架构libevent库

下载源码并解压
tar zxvf libevent-2.1.12-stable.tar.gz

然后configure, 指定交叉编译工具链的前缀(前提要将/home/niuhe/crosstool-24/x-tools/bin加到环境变量里),指定安装位置,因为没有编译openssl禁掉openssl
./configure --host=aarch64-unknown-linux-gnu --disable-openssl --prefix=/root/niuhe/libevent/libevent

然后make && make install

编译arm64架构Wind.Cosmos.Base

1.6版本只依赖libevent库,所以拿1.6版本编译尝试
编译x86_64版本
linux x64环境编译报错,查看代码发现有两个宏定义有问题,改为
#define PRId32 "%d"
#define PRId64 "%d"
需要宏定义 -D__STDC_FORMAT_MACROS (libc2.17需要宏定义,libc2.28则在inttypes.h头文件中取消了这个宏定义的条件)

编译通过

编译arm64版本
CMakeList.txt中指定编译器
SET(CMAKE_CXX_COMPILER /home/niuhe/crosstool-24/x-tools/bin/aarch64-unknown-linux-gnu-g++)
依赖库libevent替换为mips版本

编译通过

 

遇到问题解决:

将arm64平台的so库,及头文件放到交叉编译工具链的对应目录

/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib

/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/include

另外,将arm64平台的几个.a库别名

libc.a.bak
libdl.a.bak
libm.a.bak
libpthread.a.bak

 

编译juce库时,CMakeLists.txt中有find_package, 和pkg_check_modules

原cmake 3.16.0有问题,提示FindPkgConfig.make 找不到,pkg_check_modules提示Unknown CMake command "pkg_check_modules"

重新编译cmake3.16.2源码:

进入源码目录

./bootstrap --prefix=/usr/local/bin

make && make install

然后重新ln到/usr/bin/cmake

另外,juce库依赖很多安装库,将arm64环境的安装库pkgconfig目录拷贝到/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib

然后export PKG_CONFIG_PATH=/home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib/pkgconfig/

但是,有一个问题,如果CMakeLists.txt中set了 ENV{PKG_CONFIG_PATH};那么,设置的PKG_CONFIG_PATH环境变量就被替换了,那么可能就找不到环境变量中设置的PKG_CONFIG_PATH指定的目录下的*.pc文件了,那么就找不到对应库的路径了。

那么,我们看pkg-config的信息从哪里来?
很简单,有2种路径:
第一种:取系统的/usr/lib/pkgconfig下的所有*.pc文件。x86_64架构在/usr/lib64/pkgconfig目录下
第二种:PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。

那么,arm64环境移植过来的安装库pkgconfig目录,可以不通过PKG_CONFIG_PATH配置,通过:

mv /usr/lib64/pkgconfig /usr/lib64/pkgconfig.bak
ln -sf /home/niuhe/crosstool-24/gcc7.3/aarch64-unknown-linux-gnu/sysroot/lib/pkgconfig  /usr/lib64/pkgconfig

这样,pkg_check_modules时,就可以找到对应库的路径了。

只是,通过交叉编译工具链编译arm64,可以通过pkg-config找对应的库路径,x86_64编译,就不能用pkg-config找对应的库路径了。

pkg-config 详解

并且通过脚本修改pkgconfig目录下*.pc文件的includedir和libdir

#! /bin/sh

prefix="\/home\/niuhe\/crosstool-24\/gcc7.3\/aarch64-unknown-linux-gnu"

files=`ls *pc`
for f in $files
do
find . -name "$f" |xargs sed -i "s/^prefix=\/usr/prefix=$prefix/; s/libdir=\${prefix}\/lib\/aarch64-linux-gnu/libdir=\${prefix}\/sysroot\/lib/"
echo $f
done

最后,cmake .
make
编译通过

cmake教程(三)find_package和pkg_check_modules
cmake:pkg_check_modules
Makefile 使用总结

cmake

SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
SET(CMAKE_INSTALL_RPATH "\${ORIGIN}")

Linux C编程(8) 使用相对路径加载动态库-rpath和$ORIGIN

Linux安装gcc 7.3.0编译器详解(CentOS 7 64位系统)

LINUX下动态库及版本号控制

linux-->ldd命令的介绍

 
喜欢 5
分享