Genymotion用にソースファイルをコンパイル&インストールしてこの先生きのこるには


# 目的　
* tcpdumpで吐き出したトラフィックログ on エミュレーターからホストでリアルタイムで監視したいと言う思いがありました。
	* [Android端末内のトラフィックをリアルタイムでジロジロする@Wireshark & OWASP ZAP ＜○＞＜○＞](http://qiita.com/kengoscal/items/faf70fdd537a4e9984ab)
* それにはnetcatがいるのですが、実機であればnetcatはプリインストールされています。ただ実機だとパケットキャプチャするとRoot化が必要で、それは嫌だったのでGenymotionですることにしました。
* で、Genymotionにはnetcatがないので、netcatをソースからコンパイルしてインストールすることにしました
* 恐らくnetcat以外でも出来る手順だと思うので、共有させて頂きます


# 環境
* ホスト: MacOSX
* エミュレータ: Genymotion Nexus6(Lollipop)

# 手順
## GenymotionのCPUアーキテクチャの調査

```
% adb devices 
List of devices attached
192.168.57.101:5555	device

% adb -e shell uname -a
Linux localhost 3.10.0-genymotion-g1d178ae-dirty #1 SMP PREEMPT Mon Apr 27 11:57:12 CEST 2015 i686 GNU/Linux
```

* Genymotionはx86ベースっぽい
* 実機(ARM)と同じ想定でコンパイルしてもnetcatの実行はできないので注意です。下記のエラーが出ます
	*  Binary file not executable.

## netcatのソースファイルをダウンロード
* [ココ](http://netcat.sourceforge.net/download.php)
* tarファイルなので解凍する

```
% tar -xvzf netcat-0.7.1.tar.gz
```

## 環境変数SYSROOTを設定

* sysrootはターゲット(エミュレータ)のシステムヘッダやライブラリがあるディレクトリのこと
* ターゲットのAPIレベルとCPUアーキテクチャに該当するディレクトリを設定する
* $NDKは[ここ](http://developer.android.com/intl/ja/ndk/downloads/index.html)から落としてきたAndroid NDKのあるディレクトリ

```
SYSROOT=$NDK/platforms/android-21/arch-x86
```

## toolcahinの設定
* コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能の事
* NDKファイル内にandroid用の中にある　
* 下記を実行する

```
% cd $NDK/build/tools

% ./make-standalone-toolchain.sh --arch=x86 --platform=android-21 --install-dir=/tmp/android-toolchain --ndk-dir=../../. --system=darwin-x86_64
```

### make-standalone-toolchain.shの各オプション
* --arch: ビルドターゲット(Nexus6 on Genymotionのアーキテクチャ)
* --platform: AndroidのAPIレベル
* --install-dir: toolchainの保存先
* --ndk-dir: $NDK
* --system: toolchainのホストマシン(この場合MacOSXなのでdarwin-x86_64)

## コンパイル時の環境変数の設定
* 環境変数を設定して、androidのgccを使うようにする
* CCでi866ベースでコンパイル出来るように指定

```
export PATH=/tmp/my-android-toolchain/bin:$PATH
export CC=i686-linux-android-gcc
```

## コンパイル
* 解凍したnetcat-0.7.1ディレクトリの中でコンパイル

```
CFLAGS="-fPIE" LDFLAGS="-pie" ./Configure --host=x86 && make
```

* ./Configure前にフラグを設定しているが、これはLollipopからはPIE(Position Independent Executable) 以外のネイティブ実行形式がサポート外となったため
	* PIE: プロセス空間上のどのアドレスに配置されてもメモリ上のアドレステーブル等を書き換えることなくそのまま実行できる
	* [参照](http://dsas.blog.klab.org/archives/52211448.html)
	* 設定しないと下記のエラーが実行時に出ます
		* error: only position independent executables (PIE) are supported.

## 実行ファイルチェック
* できた実行ファイルをチェック

```
% file src/netcat
src/netcat: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
```

* ちゃんとIntelベースの32bit実行ファイルになっている


## エミュレータにPushして実行テスト

```
% adb push src/netcat /data/local
% adb shell /data/local/./netcat -vz localhost 12345
localhost [127.0.0.1] 12345: Connection refused
```

* おしまい

## Androidのトラフィックをリアルタイムで見るには?
* こちらに続きを書きましたのでご参照ください
	* [Android端末内のトラフィックをリアルタイムでジロジロする@Wireshark & OWASP ZAP ＜○＞＜○＞](http://qiita.com/kengoscal/items/faf70fdd537a4e9984ab)

# 参照
* https://developer.android.com/ndk/guides/standalone_toolchain.html
* http://codeseekah.com/2012/08/07/port-forwarding-an-android-local-port/#more-1296
* https://sites.google.com/site/fudist/Home/vim-nihongo-ban/android-vim-build/android-ndk-cross-compile
* http://stackoverflow.com/questions/24818902/running-a-native-library-on-android-l-error-only-position-independent-executab