找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 4696|回复: 9

[N1盒子] 【小白教程】使用交叉编译工具为N1小钢炮编译软件

[复制链接]
本帖最后由 lcsuper 于 2019-4-3 13:31 编辑

一、前言
1、自己改了一个aria2的源码编译后在openwrt上跑了1年多还算稳定。但是7621的性能还是捉急,文件多了就崩,速度10M也崩。N1算的上最有性价比的arm机器了,性能肯定高过7621。灯大出了小钢炮固件后,立马入了一个专门跑下载解放路由器。固件自带aria2,ssh上去aria2c -v看到这个版本是由aarch64-buildroot-gnu编译的。放狗得知,aarch64是ARM CPU ARMv8架构64位的执行状态。buildroot是个自动化工具,可以根据自己的需要定制Linux系统。下了个buildroot,跟着教程menuconfig后发现很像openwrt编译固件,先选CPU,文件系统,内核,第三方软件.......然而,作为从来没有编译过固件的小白来说一脸懵逼。我的经验也仅限于使用openwrtSDK编译软件的基础上。其次,发现buildroot里面第三方软件库没有aria2,要自行添加到库里面再编译。看了下教程,要自己写makefile,这超出小白能力范围,GG。其次,发现buildroot在交叉编译其他平台软件的时候,可以使用自己生成的交叉编译工具或者使用第三方交叉编译工具。又aria2c -v看了一下,发现灯大好像是用的第三方交叉编译工具gcc-linaro-aarch64-linux-gnu编译的固件。于是,想尝试一下使用第三方交叉编译工具来编译一下aria2。
2、交叉编译是个神马鬼
我们写的源码在linux系统下经过编译器gcc、g++编译成二进制代码后才能在机器上运行。make命令就是这个过程。但是这样编译出的软件只能在当前本机所使用的平台类型使用,你复制到硬件和系统都和这一样的平台才能使用。就是说同一个源码,在X86架构CPU Ubuntu64位系统下编译的软件,不能在X86CPU windows系统上运行,不能在mips架构 CPU上跑,不能在arm架构cpu上跑。
为了解决这个问题,就有了交叉编译。我在X86 CPU Linux系统下使用目标平台的专用交叉编译器,就可以将代码编译成目标平台能使用的软件。比如gcc-linaro-aarch64-linux-gnu编译器就是专门在X86 CPU Linux平台下面,编译ARM ARMv8架构 64位CPU平台下软件的编译器。
3、一般交叉编译过程
跟平常我们make源码一样。只是我们要指定编译器为专门的交叉编译器。软件所使用的所有库文件,都必须先用交叉编译器提前编译。就像我们编译openwrt的时候需要先安装环境。
4、编译的关键
关键就是makefile文件。他告诉了编译器必须的参数。但是aria2是可以多平台编译的,所以他的makefile不是固定的,是通过autoreconf根据平台架构系统的因素自动化配置出来的。看了下autoreconf的模板configure.ac文件,只有windows平台,Android平台,树莓派平台。
通过研究aria2的交叉编译文档,发现树莓派的配置文件是最可能拿来用的,因为都是arm平台的CPU,但是他是通过docker编译安装的。无奈小白才疏学浅搞不定,还好GitHub上的大神多,发现有现成的脚本。
二、操作(感谢GitHub上的veltlion大神提供的教程)

1、安装aria2的编译环境

  1. libgnutls-dev (Required for HTTPS, BitTorrent, Checksum support)
  2. nettle-dev (Required for BitTorrent, Checksum support)
  3. libgmp-dev (Required for BitTorrent)
  4. libssh2-1-dev (Required for SFTP support)
  5. libc-ares-dev (Required for async DNS support)
  6. libxml2-dev (Required for Metalink support)
  7. zlib1g-dev (Required for gzip, deflate decoding support in HTTP)
  8. libsqlite3-dev (Required for Firefox3/Chromium cookie support)
  9. pkg-config (Required to detect installed libraries)
复制代码
2、下载aria2源码解压

3、安装aarch64-linux-gnu交叉编译器,当然你也可以下载使用linaro的编译器

  1. sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu pkg-config-aarch64-linux-gnu
  2. sudo chown $UID -R /usr/aarch64-linux-gnu
  3. sudo mkdir -p /opt/aria2-arm
  4. sudo chown $UID /opt/aria2-arm
复制代码

4、修改静态编译脚本(感谢GitHub的大神q3aql,他的脚本是针对树莓派的,我们稍加修改)

这个脚本用来交叉编译aria2所要使用到的库

  1. #!/bin/bash

  2. # In this configuration, the following dependent libraries are compiled:
  3. #
  4. # * zlib
  5. # * c-ares
  6. # * expat
  7. # * sqlite3
  8. # * openSSL
  9. # * libssh2

  10. #CHECK TOOL FOR DOWNLOAD
  11. aria2c --help > /dev/null
  12. if [ "$?" -eq 0 ] ; then
  13.    DOWNLOADER="aria2c --check-certificate=false"
  14. else
  15.    DOWNLOADER="wget -c"
  16. fi

  17. ## DEPENDENCES ##
  18. ZLIB=http://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz
  19. OPENSSL=http://www.openssl.org/source/openssl-1.0.2o.tar.gz
  20. EXPAT=https://sourceforge.net/projects/expat/files/expat/2.2.0/expat-2.2.0.tar.bz2
  21. SQLITE3=http://www.sqlite.org/2018/sqlite-autoconf-3230100.tar.gz
  22. C_ARES=http://c-ares.haxx.se/download/c-ares-1.14.0.tar.gz
  23. SSH2=https://www.libssh2.org/download/libssh2-1.7.0.tar.gz

  24. ## CONFIG ##
  25. ARCH="aarch64"
  26. HOST="aarch64-linux-gnu"
  27. PREFIX="/opt/aria2-arm/build_libs"
  28. LOCAL_DIR="/opt/aria2-arm/build_libs"

  29. #TOOL_BIN_DIR="/opt/aria2-arm-rbpi/tools/arm-bcm2708/gcc-linaro-$HOST-raspbian/bin"
  30. #PATH=${TOOL_BIN_DIR}:$PATH

  31. CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a53"
  32. DEST="/usr/aarch64-linux-gnu"
  33. CC=$HOST-gcc
  34. CXX=$HOST-g++
  35. LDFLAGS="-L$DEST/lib"
  36. CPPFLAGS="-I$DEST/include"
  37. CXXFLAGS=$CFLAGS
  38. MAKE="make -j`nproc`"
  39. CONFIGURE="./configure --prefix=${LOCAL_DIR} --host=$HOST"
  40. BUILD_DIRECTORY=/tmp/

  41. ## BUILD ##
  42. cd $BUILD_DIRECTORY
  43. #
  44. # zlib build
  45.   $DOWNLOADER $ZLIB
  46.   tar zxvf zlib-1.2.11.tar.gz
  47.   cd zlib-1.2.11/
  48.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc STRIP=$HOST-strip RANLIB=$HOST-ranlib CXX=$HOST-g++ AR=$HOST-ar LD=$HOST-ld ./configure --prefix=$PREFIX --static
  49.   make
  50.   make install
  51. #
  52. # expat build
  53.   cd ..
  54.   $DOWNLOADER $EXPAT
  55.   tar jxvf expat-2.2.0.tar.bz2
  56.   cd expat-2.2.0/
  57.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX --enable-static=yes --enable-shared=no
  58.   make
  59.   make install
  60. #
  61. # c-ares build
  62.   cd ..
  63.   $DOWNLOADER $C_ARES
  64.   tar zxvf c-ares-1.14.0.tar.gz
  65.   cd c-ares-1.14.0/
  66.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` --prefix=$PREFIX --enable-static --disable-shared
  67.   make
  68.   make install
  69. #
  70. # Openssl build
  71.   cd ..
  72.   $DOWNLOADER $OPENSSL
  73.   tar zxvf openssl-1.0.2o.tar.gz
  74.   cd openssl-1.0.2o/
  75.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./Configure linux-aarch64 $CFLAGS --prefix=$PREFIX shared zlib zlib-dynamic -D_GNU_SOURCE -D_BSD_SOURCE --with-zlib-lib=$LOCAL_DIR/lib --with-zlib-include=$LOCAL_DIR/include
  76.   make CC=$CC
  77.   make CC=$CC install INSTALLTOP=$DEST OPENSSLDIR=$DEST/ssl
  78. #
  79. # sqlite3
  80.   cd ..
  81.   $DOWNLOADER $SQLITE3
  82.   tar zxvf sqlite-autoconf-3230100.tar.gz
  83.   cd sqlite-autoconf-3230100/
  84.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ ./configure --host=$HOST --prefix=$PREFIX --enable-static --enable-shared --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE`
  85.   make
  86.   make install
  87. #
  88. # libssh2
  89.   cd ..
  90.   $DOWNLOADER $SSH2
  91.   tar zxvf libssh2-1.7.0.tar.gz
  92.   cd libssh2-1.7.0/
  93.   rm -rf $PREFIX/lib/pkgconfig/libssh2.pc
  94.   PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ LD_LIBRARY_PATH=$PREFIX/lib/ CC=$HOST-gcc CXX=$HOST-g++ AR=$HOST-ar RANLIB=$HOST-ranlib ./configure --host=$HOST --without-libgcrypt --with-openssl --without-wincng --prefix=$PREFIX --enable-static --disable-shared
  95.   make
  96.   make install
  97. #
  98. #cleaning
  99.   cd ..
  100.   rm -rf c-ares*
  101.   rm -rf sqlite-autoconf*
  102.   rm -rf zlib-*
  103.   rm -rf expat-*
  104.   rm -rf openssl-*
  105.   rm -rf libssh2-*
  106. #
  107. echo "finished!"
复制代码
存为aria2lib到aria2文件夹

5、这个脚本是修改confg的,其中打了一个补丁,破解aria2最大128线程

  1. #!/bin/bash

  2. # In this configuration, the following dependent libraries are used:
  3. #
  4. # * zlib
  5. # * c-ares
  6. # * expat
  7. # * sqlite3
  8. # * openSSL
  9. # * libssh2

  10. ##patch##
  11. wget https://aur.archlinux.org/cgit/aur.git/plain/aria2-fast.patch?h=aria2-fast -O aria2-fast.patch
  12. patch -Np1 < aria2-fast.patch

  13. ## CONFIG ##
  14. test -z "$HOST" && HOST=aarch64-linux-gnu
  15. test -z "$PREFIX" && PREFIX=/opt/aria2-arm/build_libs

  16. ARCH="aarch64"
  17. HOST="aarch64-linux-gnu"
  18. PREFIX="/opt/aria2-arm/build_libs"
  19. LOCAL_DIR="/opt/aria2-arm/build_libs"

  20. CFLAGS="-march=armv8-a+crypto+crc -mtune=cortex-a53"
  21. DEST="/usr/aarch64-linux-gnu"
  22. CC=$HOST-gcc
  23. CXX=$HOST-g++
  24. LDFLAGS="-L$DEST/lib"
  25. CPPFLAGS="-I$DEST/include"
  26. CXXFLAGS=$CFLAGS
  27. MAKE="make -j`nproc`"
  28. CONFIGURE="./configure --prefix=${LOCAL_DIR} --host=$HOST"

  29. ./configure \
  30.     --host=$HOST \
  31.     --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
  32.     --prefix=$PREFIX \
  33.     --disable-nls \
  34.     --without-gnutls \
  35.     --with-openssl \
  36.     --without-libxml2 \
  37.     --with-libz --with-libz-prefix=${LOCAL_DIR} \
  38.     --with-libexpat --with-libexpat-prefix=${LOCAL_DIR} \
  39.     --with-slite3 --with-sqlite3-prefix=${LOCAL_DIR} \
  40.     --with-libcares --with-libcares-prefix=${LOCAL_DIR} \
  41.     --with-ca-bundle='/etc/ssl/certs/ca-certificates.crt' \
  42.     LDFLAGS="-L$LOCAL_DIR/lib" \
  43.     PKG_CONFIG_PATH="$LOCAL_DIR/lib/pkgconfig" \
  44.     ARIA2_STATIC=yes
复制代码
存为aria2config到aria2文件夹

6、填Sphinx索引的坑。使用python的asc码和平台用的utf8不一致,会报错
打开usr/lib/python2.7/posixpath.py

在顶上加上

  1. reload(sys)
  2. sys.setdefaultencoding('utf-8')
复制代码

7、进入aria2文件夹,打开终端,一个一个打命令
  1. sudo ./aria2lib
  2. autoreconf -i
  3. sudo ./aria2config
复制代码

以上都不报错就make

在aria2/src下会生成aria2c的文件,因为是静态编译,体积达到了90多兆

8、减小aira2c的体积

  1. aarch64-linux-gnu-strip src/aria2c
复制代码

变成6M多了
9、ssh上传到小钢炮的/usr/bin,覆盖aria2c即可,改新的aria2c为7777
三、后记
1、Ubuntu要装新一些的版本,老版本没有国内镜像源了。。。。。。。官方的我连不上。
2、这个脚本原来是针对树莓派的,仅仅修改了
ARCH="aarch64"
HOST="aarch64-linux-gnu"
CFLAGS="-march=armv8-a+crypto+crc-mtune=cortex-a53"
去掉了原来的TOOL_BIN_DIR 和 PATH
把 linux-armv4 改成 linux-aarch64 。

3、小钢炮现在有docker了装软件方便多了
4、论坛贴的代码吃了不少格式符号,如果报错,请自行去GitHub下载原始脚本改吧(https://github.com/q3aql/aria2-static-builds/tree/master/build-scripts)

我的恩山、我的无线 The best wifi forum is right here.
感谢老大分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

挺牛的,折腾了多久啊?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

简单问题复杂化了啊。。
我传一个去掉下载限制的版本。

链接:https://eyun.baidu.com/s/3smci4WX 密码:9BTN

改属性为755就可以运行,也可以放/usr/bin代替小钢炮的,我这个把下载16线程限制改成1024了。

点评

我当然不只是改了你这一点代码了,新增了一点功能,还修复一个bug  详情 回复 发表于 2019-4-3 20:16
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

感谢,学习了。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

牛逼,学习了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
本帖最后由 lcsuper 于 2019-4-3 20:17 编辑
lonee 发表于 2019-4-3 13:51
简单问题复杂化了啊。。
我传一个去掉下载限制的版本。

我当然不只是改了这一点代码了,新增了一点功能,还修复一个bug,不重新编译不行
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

不错不错,谢谢分享!最近正在尝试交叉编译,准备把privoxy交叉编译个arm64版本出来,再把它dockerfile了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

先标记一下,感谢分享
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

不错,编了一个我家云用的1.36版本
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-28 16:07

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表