使用crosstool-NG 1.24.0来构建arm-cortex_a8-linux-gnueabi样本的工具链时,即使根据标准流程执行命令,依然会出现各种各样的问题。本文在使用标准的安装和构建流程的同时,展示过程中可能出现的问题及解决办法,最终的目标是成功安装arm-cortex_a8-linux-gnueabi工具链。
为了避免出现奇怪的错误,请先执行以下这条命令来安装这些包:
sudo apt-get install autoconf automake bison bzip2 cmake flex \
g++ gawk gcc gettext git gperf help2man libncurses5-dev \
libstdc++6 libtool libtool-bin make patch rsync texinfo unzip \
wget xz-utils
1. 安装crosstool-NG
以下是标准安装命令,这些命令可以解压提取1.24.0版本的crosstool-NG,并创建前端菜单系统ct-ng。
$ cd ~
$ git clone https://github.com/crosstool-ng/crosstool-ng.git
$ cd crosstool-ng
$ git checkout crosstool-ng-1.24.0
$ ./bootstrap
$ ./configure --prefix=${PWD}
$ make
$ make install
建议安装在用户主目录下($ cd ~),其他地方可能需要root权限,导致权限问题。
运行 $ git checkout crosstool-ng-1.24.0 可以将当前的工作目录切换到 crosstool-ng 项目的 1.24.0 版本。
运行 $ ./configure --prefix=${PWD} 可以使程序安装在当前目录下,这样可以避免对root权限的需要。如果直接运行 $ ./configure 则会安装到默认位置 /usr/local/bin 中,需要root权限。
问题1.1
运行 $ git checkout crosstool-ng-1.24.0 时出现错误提示
user@Linux:/crosstool-ng$ git checkout crosstool-ng-1.24.0
fatal: detected dubious ownership in repository at '/crosstool-ng'
To add an exception for this directory, call:
git config --global --add safe.directory /crosstool-ng
git config --global --add safe.directory /crosstool-ng
解决办法:根据提示,运行git config --global --add safe.directory /crosstool-ng之后再运行git checkout crosstool-ng-1.24.0。
2. 构建arm-cortex_a8-linux-gnueabi工具链
根据之前的步骤,此时的ct-ng应该被安装在 ~/crosstool-ng/bin/ct-ng 目录下了。接下来,标准的工具链搭建流程是:选择目标配置;使用配置菜单menuconfig查看配置并进行更改;开始工具链搭建,命令如下:
$ bin/ct-ng arm-cortex_a8-linux-gnueabi
$ bin/ct-ng menuconfig
--------------------------------------------------------
建议在菜单界面进行以下更改:
1. 在Paths and misc options中,禁用Render the toolchain read-only
2. 在Target options -> Floating point中,选择hardware(FPU)
3. 在Target options中,为Use specific FPU输入neon
--------------------------------------------------------
$ bin/ct-ng build
按照这个流程和配置,会创建一个使用硬件浮点寄存器的工具链。
但是在build过程中有可能会出现以下问题。
问题2.1
build过程中,Retrieving 'isl-0.20'时出现isl: download failed错误提示
[INFO ] Retrieving needed toolchain components' tarballs
[EXTRA] Retrieving 'isl-0.20'
[ERROR] isl: download failed
解决办法:在选定目标之后输入以下内容,再重新build
sed -e 's|CT_ISL_MIRRORS=.*$|CT_ISL_MIRRORS="https://libisl.sourceforge.io"|' \
-e 's|CT_EXPAT_MIRRORS=.*$|CT_EXPAT_MIRRORS="https://github.com/libexpat/libexpat/releases/download/R_2_2_6"|' \
-i .config
具体命令过程为:
$ bin/ct-ng arm-cortex_a8-linux-gnueabi
$ sed -e 's|CT_ISL_MIRRORS=.*$|CT_ISL_MIRRORS="https://libisl.sourceforge.io"|' \
-e 's|CT_EXPAT_MIRRORS=.*$|CT_EXPAT_MIRRORS="https://github.com/libexpat/libexpat/releases/download/R_2_2_6"|' \
-i .config
$ bin/ct-ng build
问题2.2
build过程中,Building binutils时出现gold文件相关的报错
[EXTRA] Building binutils
[ERROR] /crosstool-ng/.build/arm-cortex_a8-linux-gnueabi/src/binutils/gold/errors.h:87:50: error: 'string' in namespace 'std' does not name a type
[ERROR] /crosstool-ng/.build/arm-cortex_a8-linux-gnueabi/src/binutils/gold/errors.h:87:50: error: 'string' in namespace 'std' does not name a type
解决办法:输入 $ bin/ct-ng menuconfig 打开菜单界面,将
Binary Utilities -> Linkers to enable (ld, gold) 下的选项改为 ld (原本是ld, gold)
这样就能正常运行。
----------------------------------
如果按照步骤来操作,等待30-50分钟,build提示成功后,构建好的工具链就会出现在~/x-tools/arm-cortex_a8-linux-gnueabihf中。
使用命令:
$ PATH=~/x-tools/arm-cortex_a8-linux-gnueabihf/bin:$PATH
将临时环境变量添加到此时的终端中。
然后可以尝试使用编译器来编译下自己的代码,如:
$ arm-cortex_a8-linux-gnueabihf-gcc example.c -o example
再通过 $ file example 来输出文件的类型,以确认交叉编译器正常工作。