买了一个几块钱的随身WIFI,CPU是TSP ZX297520V3(ARMv7 Processor rev 4 (v7l) ),做了一个交叉编译工具链,编译了简单的程序进行测试。简单记录一下全部的步骤,如下:
一、目标工具链版本
binutils-2.16.1
linux-3.4.110
uClibc-0.9.33.2
gcc-3.4.3
宿主系统为Manjaro,宿主工具链为pacman直接安装的gcc和binutils
二、编译流程
1. 建立新的工作目录
-
mkdir test (临时工具目录)
-
将所有工具链解压到test目录
-
mkdir test/tools (新编译出的工具链目录)
2. 编译Binutils
-
cd binutils-2.16.1
-
./configure --target=arm-linux --prefix=/home/dan/test/tools --program-prefix=arm-linux-
-
make
-
make install
-
export PATH=$PATH:/home/dan/test/tools/bin
3. 编译不含库GCC
-
cd ../gcc-3.4.3
-
./configure --target=arm-linux --prefix=/home/dan/test/tools --program-prefix=arm-linux- --disable-shared --disable-threads --enable-languages="c" --with-newlib
-
make
-
make install
4. 编译内核头文件
-
cd ../linux-3.4.110
-
make ARCH=arm headers_check
-
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
-
sudo cp -rv dest/include/* ../tools/include
5. 编译uClibc
-
cd ../uClibc-0.9.33.2
-
make menuconfig (根据需要填)
uClibc runtime library directory 和 uClibc development environment directory 不填
-
vi .config (CROSS_COMPILER_PREFIX="/home/dan/test/tools/bin/arm-linux-")
-
mkdir build
-
make PREFIX=${PWD}/build install
-
sudo cp build/* ~/test/tools -r
6. 第二次编译GCC
-
cd ../gcc-3.4.3
-
./configure --target=arm-linux --prefix=/home/dan/test/tools --program-prefix=arm-linux- --enable-languages="c" --with-headers=/home/dan/test/tools/include --with-libs=/home/dan/test/tools/lib --with-sysroot=/home/dan/test/tools/
-
make
-
make install
-
sudo cp /home/dan/test/tools/lib/libc.so.0 /lib
-
sudo cp /home/dan/test/tools/lib/uclibc_nonshared.a /lib
-
sudo cp /home/dan/test/tools/lib/ld-uClibc.so.0 /lib
7. 编译实际应用程序
/* 测试程序 */
/* 文件名: a.c */
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
-
./tools/bin/arm-linux-gcc ./a.c -o a.out -I /home/dan/test/tools/include -Wl,--dynamic-linker=/lib/ld-uClibc.so.0
-
./tools/bin/arm-linux-strip ./a.out
运行程序:
adb push a.out /mnt/userdata/
adb shell
cd /mnt/userdata/
chmod 777 a.out
./a.out
8. 完整工具链构建脚本
# 源代码目录 test-src-archive
# 建立工作目录
mkdir -p test && cd test
mkdir -p tools
WORKDIR=`pwd`
# 解压源码
tar -xf ../test-src-archive/uClibc-0.9.33.2.tar
tar -xf ../test-src-archive/linux-3.4.110.tar
tar -xf ../test-src-archive/binutils-2.16.1.tar.bz2
tar -xf ../test-src-archive/gcc-3.4.3.tar.bz2
# 编译Binutils
cd binutils-2.16.1
./configure --target=arm-linux --prefix=${WORKDIR}/tools --program-prefix=arm-linux-
make
make install
export PATH=$PATH:${WORKDIR}/tools/bin
# 编译不含库的GCC
cd ../gcc-3.4.3
./configure --target=arm-linux --prefix=${WORKDIR}/tools --program-prefix=arm-linux- --disable-shared --disable-threads --enable-languages="c" --with-newlib
make
make install
# 编译内核头文件
cd ../linux-3.4.110
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
sudo cp -rv dest/include/* ${WORKDIR}/tools/include
# 编译uClibc
cd ../uClibc-0.9.33.2
make menuconfig
sed -i -e "s#CROSS_COMPILER_PREFIX=\"\"#CROSS_COMPILER_PREFIX=\"${WORKDIR}/tools/bin/arm-linux-\"#g" .config
mkdir -p build
make PREFIX=${PWD}/build install
sudo cp build/* ${WORKDIR}/tools -r
# 第二次编译GCC
cd ../gcc-3.4.3
./configure --target=arm-linux --prefix=${WORKDIR}/tools --program-prefix=arm-linux- --enable-languages="c" --with-headers=${WORKDIR}/tools/include --with-libs=${WORKDIR}/tools/lib --with-sysroot=${WORKDIR}/tools/
make
make install
sudo cp ${WORKDIR}/tools/lib/libc.so.0 /lib
sudo cp ${WORKDIR}/tools/lib/uclibc_nonshared.a /lib
sudo cp ${WORKDIR}/tools/lib/ld-uClibc.so.0 /lib