• スポンサードリンク

libjpeg-turboをAndroid6以降のx86端末で動かせんかった件

API23(Android6)以降ではTEXTRELエントリ/フラグを含む共有ライブラリをロードできなくなりました。

簡易的には

とした時に何も出力されなければOK、TEXTRELエントリ/フラグを含む時は

てな風に出力されます。

readelfはndkのどこやらにあるarm-linux-androideabi-readelfやらi686-linux-android-readelfが本当のコマンド名です。でも長いので自分の環境ではシェルのエリアスにしてそれぞれreadelfとreadelf86と言うことになっとります。

もう少しまじめに調べるにはLinuxでscanelfというのを使います。
すると

というのがデレデレと出てきます。
ここで出てきた[0x46384]とかがおえんちゅう事なので共有ライブラリを(objdump使うとかして)逆アセンブルした結果から怪しい所を探しだしてさらに元のアセンブラのソースを探しだして…てな事をします。

もっともarm用バイナリの方はTEXTRELエントリ/フラグを含んでないので特に問題なし。
でもx86バイナリ(確かめてないけど多分x86-64バイナリも)にはTEXTRELエントリ/フラグを含んでいるので動かんのです。

普通のC/C++コードであれば-fPIC/-fpic指定でリロケータブルなバイナリになるんやけどなぁ

でも-fPIC指定してもだめ…アセンブラの部分に入っとるみたいやねん。
SSEとか使わへんねやったらアセンブラの部分を全部オミットできるから大丈夫やねん。
でもそれやとlibjpeg-turboを使う意味があらへんねん。

scanelfかけると1305個もあるねん。
手動でTEXTRELを含まんように書き換えれば…1305個もあるのに一個ずつ治すなんてアホなことできるかぁー

うーん(。・_・。) 無理かも(T_T)

なんとかならんかなぁ…うーん(。・_・。)

ドキュメントを読むことしばし…なんとかならんかなぁ…(´・ω・`)

libjpeg-turboのWebサイトとGitHubのリポジトリ・issueを読むことしばし…何とかならんかなぁ…(T_T)

libjpeg-turboのソースコードを読むことしばし…しばしばしばし…ムー

どうやらnasmのコマンドラインに-DPICと渡せばいいらしい @jsimdext.inc:88

androidのndk使とってどうやってnasmに渡すんじゃろ?まさか.asmだけ別にコマンドラインから.oにしといて…なんぼファイルあると思とんねん。

ムム…ムムムぅー悩むことしばし…

Android.mkのx86用バイナリのセットアップする部分に

を追加してみた。土器ドキ怒気時?

ビルドし直すと…

readelf通しても何もでんくなった\(^o^)/
さらにAndroid6なx86端末にインストールして動かしてみると動いたぁ
\(^o^)/\(^o^)/\(^o^)/ ← 万歳三唱な^^

« »

  • スポンサードリンク

コメントを残す

%d人のブロガーが「いいね」をつけました。