PQI Air Card向けにSSL付きcurlをコンパイル(まとめ)

以前から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*

無事にできているようですね!

前回の反省も含めて色々と改善してみましたが、設置するファイルも減って満足です。

まだまだ勉強不足かと思いますし、ご指摘あれば何なりと言ってください!

「PQI Air Card向けにSSL付きcurlをコンパイル(まとめ)」への1件のフィードバック

  1. お世話になります

    今そちらのcurlを使っているのですがSegmentation fault と出て実行できないことがあり困っております。

    何か解決策などがありましたら教えていただきたいと思っています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です