web-dev-qa-db-ja.com

mylib.soにはテキストの再配置があります。これはメモリの浪費であり、セキュリティ上のリスクです。修正してください

My Androidアプリケーション(ネイティブライブラリを使用)でこの警告を印刷Android 4.4:

リンカーmylib.soにはテキストの再配置があります。これはメモリの浪費であり、セキュリティ上のリスクです。修正してください。

それが何であり、それを修正する方法についてのアイデアを持っていますか?おかげで、

41
Jerome

これは https://code.google.com/p/Android/issues/detail?id=232 で言及されている2つのndk-gccバグの結果であるように思われます。

そして、ndk-r8cの時点で修正されていると述べました。

問題のあるライブラリのチェックは最近追加されたようです。

注:リンクのURLを非表示にするためにこの投稿を編集しないでくださいしないでください。宛先は信頼できるものであるため、明示的です。

その他の注意NDKバージョンの変更は、警告がアプリケーションのコードによるものである場合にのみ修正されます。警告が代わりにlibdvmなどのシステムコンポーネントにある場合、効果はありません。これはシステムの更新によってのみ修正できます。

26
Chris Stratton

ライブラリ内のコードを独立した位置にする必要があります... add -fpic または -fPICあなたのLOCALC_FLAGSをAndroid.mkに追加し、テキストの再配置を含む静的ライブラリまたは共有ライブラリに対してリンクしていないことを確認する必要もあります。それらを実行し、再コンパイルできる場合は、上記のフラグのいずれかを使用します。

要するに、_-fpic_フラグまたは_-fPIC_フラグのいずれかを使用してライブラリをコンパイルする必要があります。ここで、[〜#〜] pic [〜#〜]Position Independent Code の略語です。

より長い答えは、あなたのyourlib.soはGoogle Androidこの_Dynamic Array Tag_エントリが予期しないELFファイルの標準。最良の場合、ライブラリは引き続き実行されますが、それでもエラーであり、将来のAOSバージョンではおそらく実行が許可されません。

DT_TEXTREL 0x16 (22)

ライブラリの内容を確認するには、次の行に沿って何かを使用します。

_# readelf --wide -S yourlib.so

There are 37 section headers, starting at offset 0x40:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        0000000000000000 002400 068f80 00  AX  0   0 16
  [ 2] .rodata           PROGBITS        0000000000000000 06b380 05ad00 00  WA  0   0 32
  ...
  [16] .rela.text        RELA            0000000000000000 26b8e8 023040 18     14   1  8
  ...
  [36] .rela.debug_frame RELA            0000000000000000 25a608 0112e0 18     14  27  8

Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)
_

_DT entry_の詳細については、トピックの 私の広範な回答 を参照してください。適切な動的ライブラリの作成方法の詳細については、 これは必読です です。

3
not2qubit

アプリケーションでも同じエラーが発生しました。アプリケーションは、ヘッダーファイルのすべての機能を実装していないネイティブライブラリを使用するネイティブデーモンを使用していました。必要な実装をネイティブライブラリに追加すると、すべてが機能しました。

あなたがまったく同じ問題を抱えているかどうかはわかりませんが、おそらくあなたのネイティブ側に何らかの不一致があることを意味します。

1
Ravit D