以前からPQI Air Card向けにcurlをコンパイルしてきましたが、かなりハマったため記事が数回に分かれてまとまりがなくなっていました。
そこで、今度届くPQI Air Penの予習も兼ねてcurlのコンパイルをいまいちどまとめて見ようと思います。
今回作ったファイルは、こちらに置いておきます。
[http://wp.sakaki333.com/wp-content/uploads/2017/01/curl_pqi.tar.gz]
バイナリとライブラリをコピーするなりして使っていただけると幸いです。
環境
- ubuntu 16.04 64bit(VM)
- こちらの記事でsshやbusyboxなど導入済みのPQI Air Card
準備
まずはコンパイラを準備します。コンパイラは32bit向けのものを使うため、32ビットバイナリが動くようにしておきます。
$ sudo apt-get install lib32z1
作業ディレクトリを作っておきます。
$ mkdir -p ~/pqi/bin
$ mkdir ~/pqi/source
$ cd ~/pqi
コンパイラは、ここから取得します。
$ wget https://sourcery.mentor.com/public/gnu_toolchain/arm-none-linux-gnueabi/arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ tar xf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
$ mv arm-2010q1 arm-dev
$ export PATH=$PATH:~/pqi/arm-dev/bin
arm-でタブを打って、補完が効くか確かめます。
$ arm-none-linux-gnueabi-[TAB]
arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-g++ arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-readelf
arm-none-linux-gnueabi-ar arm-none-linux-gnueabi-gcc arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-size
arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gcc-4.4.1 arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-sprite
arm-none-linux-gnueabi-c++ arm-none-linux-gnueabi-gcov arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-strings
arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-gdb arm-none-linux-gnueabi-objdump arm-none-linux-gnueabi-strip
arm-none-linux-gnueabi-cpp arm-none-linux-gnueabi-gdbtui arm-none-linux-gnueabi-ranlib
依存ライブラリをコンパイル
コンパイラができたので、まずはzlibをコンパイルします。
$ cd ~/pqi/source
$ git clone git://github.com/madler/zlib.git
$ cd zlib
$ git checkout -b work_1.2.8 v1.2.8
$ export CC=arm-none-linux-gnueabi-gcc
$ ./configure --prefix=$HOME/pqi/bin/zlib
$ make
$ make install
次にopensslをコンパイルです。
$ cd ~/pqi/source
$ wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
$ tar xf openssl-1.0.2j.tar.gz
$ cd openssl-1.0.2j
$ ./Configure dist --prefix=$HOME/pqi/bin/openssl
$ make CC="arm-none-linux-gnueabi-gcc" AR="arm-none-linux-gnueabi-ar r" RANLIB="arm-none-linux-gnueabi-ranlib"
$ make install
curlをクロスコンパイル
$ cd ~/pqi/source
$ wget http://curl.haxx.se/download/curl-7.37.1.tar.gz
$ tar xf curl-7.37.1.tar.gz
$ export ROOTDIR="${PWD}"
$ cd curl-7.37.1/
$ export CROSS_COMPILE="arm-none-linux-gnueabi"
$ export CPPFLAGS="-I${HOME}/pqi/bin/openssl/include -I${HOME}/pqi/bin/zlib/include"
$ export LDFLAGS="-L${HOME}/pqi/bin/openssl/lib -L${HOME}/pqi/bin/zlib/lib"
$ export AR=${CROSS_COMPILE}-ar
$ export AS=${CROSS_COMPILE}-as
$ export LD=${CROSS_COMPILE}-ld
$ export RANLIB=${CROSS_COMPILE}-ranlib
$ export CC=${CROSS_COMPILE}-gcc
$ export NM=${CROSS_COMPILE}-nm
$ export LIBS="-lssl -lcrypto"
$ ./configure --prefix=${HOME}/pqi/bin/curl --target=${CROSS_COMPILE} --host=${CROSS_COMPILE} --build=x86_64-pc-linux-gnu --with-ssl --with-zlib
$ make
$ make install
前回はエラーが出たりもしましたが、今回はすんなりと通りました。
ちなみに生成されたディレクトリは以下のようになっていました。
├── bin
│ ├── curl
│ └── curl-config
├── include
│ └── curl
│ ├── curl.h
│ ├── curlbuild.h
│ ├── curlrules.h
│ ├── curlver.h
│ ├── easy.h
│ ├── mprintf.h
│ ├── multi.h
│ ├── stdcheaders.h
│ └── typecheck-gcc.h
├── lib
│ ├── libcurl.a
│ ├── libcurl.la
│ ├── libcurl.so -> libcurl.so.4.3.0
│ ├── libcurl.so.4 -> libcurl.so.4.3.0
│ ├── libcurl.so.4.3.0
│ └── pkgconfig
│ └── libcurl.pc
(略)
容量を減らすためにstripしておきます。
$ cd ~/pqi/bin/curl/lib
$ arm-none-linux-gnueabi-strip libcurl.so.4.3.0
これでもともと2.5MBだったライブラリが2.1MBくらいに減りました。
ファイルのコピー
さて、前回はman以外は全部コピーしていましたが、よく考えたら普通にヘッダーとか要りませんよね。
てことで、コピーするのはバイナリとライブラリだけにします。
さらに、前回はシンボリックリンクのライブラリをFAT32に置けるようにフルコピーしていましたが、今回は読み込んでくれそうな名前にリネームして1つだけ置くことにしました。
手元のLinuxのcurlがlibcurl.so.4を参照していたので、それに合わせてリネームします。
$ cp ~/pqi/bin/curl/bin/curl* /path/to/pqi/DCIM/122_TREK/usr/bin/
$ cp ~/pqi/bin/curl/lib/libcurl.so.4.3.0 /path/to/pqi/DCIM/122_TREK/usr/lib/libcurl.so.4
$ ls /path/to/pqi/DCIM/122_TREK/usr/bin
curl curl-config
$ ls /path/to/pqi/DCIM/122_TREK/usr/lib
libcurl.so.4
PQI Air Cardを再起動させた後にSSHして、curlを実行してみます。
$ ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 root@(PQI Air CardのIPアドレス)
# curl
curl: try 'curl --help' or 'curl --manual' for more information
# curl -k "https://raw.githubusercontent.com/github/gitignore/master/Java.gitignore"
*.class
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.ear
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
無事にできているようですね!
前回の反省も含めて色々と改善してみましたが、設置するファイルも減って満足です。
まだまだ勉強不足かと思いますし、ご指摘あれば何なりと言ってください!
お世話になります
今そちらのcurlを使っているのですがSegmentation fault と出て実行できないことがあり困っております。
何か解決策などがありましたら教えていただきたいと思っています。