【完結】PQI Air CardでSSL付きのcurlを動かす


追記 2017/01/19

さらに新しい記事を書きました

http://wp.sakaki333.com/2017/01/19/post-870/ にバイナリ置いておきました。

粗末なものですが、よかったら使ってくださいね〜


前回の記事でPQI Air Card向けにcurlをクロスコンパイルしました。

あとは実機で動作確認だけだと意気込みましたが、実際のところ昨日までaptでぬるま湯に浸かっていた素人がクロスコンパイルしたバイナリが動くわけ無いですよね・・・

今回は、なんとか動作するまでこぎつけましたので、その記録を書いていきます。

バイナリをコピー

PQI Air Cardのカスタマイズはおおよそこの記事がベースになっていまして、この方がPQI Air CardのCPUで動く様々なバイナリを作ってくださっています。

今回の記事もこれらのバイナリを導入済みで書いているので、インストールはこの記事の方針に合わせます。

まず、コンパイルされたcurlバイナリをPQI Air Cardの DCIM/122_TREK/usr 以下にコピーします。

$ cd /path/to/PQI_Air_Card/DCIM/122_TREK/usr
$ cp -r ~/curlArm/bin ./bin
$ cp -r ~/curlArm/include ./include
$ cp -r ~/curlArm/lib ./lib

私はファイルマネージャから行ったので出力は違うかもしれませんが、シンボリックリンクがサポートされていませんとエラーが出ました。

この環境でPQI Air Card上でバイナリを実行するとセグフォが出ます。

# curl
Segmentation Fault

悲しいことにこれの原因がライブラリ不足だと気付くのにしばらくかかってしまいました。

FATはシンボリックリンクをサポートしていないので、ライブラリが参照できなかったのですね。

ライブラリをコピーして、必要なファイルを作成しました。

$ cd lib
$ cp libcurl.so.4.3.0 libcurl.so.4
$ cp libcurl.so.4.3.0 libcurl.so

これで実行すると、お次はこんなエラーが。。

# curl
curl: /lib/libc.so.6: version `GLIBC_2.17' not found (required by curl)
curl: /lib/libc.so.6: version `GLIBC_2.17' not found (required by libcurl.so.4)

調べてみると、これはlibcのバージョンが低いために起きるエラーらしいです。

早速PQI Air Cardのバージョンを確認してみると、

# /lib/libc.so.6
GNU C Library (Sourcery CodeBench Lite 2011.09-70) stable release version 2.13, by Roland McGrath et al.
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.6.1.
Compiled on a Linux 3.0.1 system on 2011-12-07.
Available extensions:
    crypt add-on version 2.1 by Michael Glad and others
    GNU Libidn by Simon Josefsson
    Native POSIX Threads Library by Ulrich Drepper et al
    Support for some architectures added on, not maintained in glibc core.
    BIND-8.2.3-T5B
libc ABIs: UNIQUE
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>

なるほど、libcのバージョンは2.13なので、要求されている2.17には届いていないですね。

しばらく調べましたが、このサイトによると、必要なlibcのバージョンはコンパイラによって決定されるそうです。

つまり、今使っているコンパイラが必要としているlibcのバージョンが高すぎる事が原因らしいのですが、だったら何故Pythonはコンパイルできたのだろうか・・・

考えていても仕方がないので、新しい(というか実際は”もっと古い”ですが笑)コンパイラを探しに行きます。

なお、libcはC言語のバイナリの基本的な命令を実行するために必要な最重要ライブラリで、システムにある他のライブラリとも密に連携しています。

libcのアップデートはかなり危険っぽいので、やめておいたほうが良いと思います。

コンパイラを入手

今回はいくつか試しましたが、正常に動いたものはここからダウンロードできます。

入っているコンパイラの実行ファイルのファイル構成はほぼ一緒ですので、コンパイラは置き換えてください。

zlibとopensslを再度ビルド

前回の記事と同じようにコンパイルし直します。

ただ、opensslのmake中に何故かコンパイラのパスが変に設定されていたので、シンボリックリンクを貼って一時しのぎをしました。

/bin/sh: 6: arm-none-linux-gnueabiranlib: not found
Makefile:540: ターゲット 'install_sw' のレシピで失敗しました
make: *** [install_sw] エラー 127
$ cd /path/to/arm_compiler
$ ln -s arm-none-linux-gnueabi-ranlib arm-none-linux-gnueabiranlib

何か環境変数がおかしな設定になっていたのでしょうか。

変な対応方法になってしまいましたが、これでうまくいったので良しとします。。

curlを再ビルド

では、いよいよ再度curlをビルドします。

方法は前回と同じです。

ただし、./configureの出力に違いが現れました。

  curl version:     7.37.1
  Host setup:       arm-none-linux-gnueabi
  Install prefix:   /home/sakaki/curlArm
  Compiler:         arm-none-linux-gnueabi-gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      no      (--with-libssh2)
  zlib support:     enabled
  GSS-API support:  no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     no      (--enable-ipv6)
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   no
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     no      (--with-librtmp)
  metalink support: no      (--with-libmetalink)
  HTTP2 support:    disabled (--with-nghttp2)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP HTTPS IMAP IMAPS POP3 POP3S RTSP SMTP SMTPS TELNET TFTP

前回無効になっていたzlibが有効になっています。なんか知らんけどやったね!

ビルドが完了したら、再びシンボリックリンクを手動コピーしてSDカードへコピーします。

いよいよ実行へ

ここまで長い時間がかかりましたが、やっと実行できるバイナリができました。

実行時にSSL証明書のエラーが出ましたが、今回は証明書チェックは行わないので-kオプションで無視するようにします。

$ touch "abc" > /root/test.txt
$ curl -k -X PUT -u username:password "https://yourowncloud.com/remote.php/webdav/Photo/test.txt" --data-binary @"/root/test.txt"

これでowncloudにtest.txtがアップロードされていれば、作業は完了です。

クロスコンパイルは環境依存な部分が多くて大変なのは知っていましたが、やっぱりよくわからない部分が多くて大変でした。

今回なんとかcurlのビルドに成功したので、他にほしいバイナリがあったら再びビルドに挑戦してみようと思います。

「【完結】PQI Air CardでSSL付きのcurlを動かす」への2件のフィードバック

コメントを残す

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