web-dev-qa-db-ja.com

「共有オブジェクトからのセグメントのマッピングに失敗しました:操作が許可されていません」の考えられる原因とデバッグ方法を教えてください。

2つの実行可能ファイルがあり、どちらもAndroidで実行するためにクロスコンパイルされています。同じディレクトリのデバイスに両方を配置しました。 ld-linux.so.3を含め、依存しているすべての共有ライブラリを同じディレクトリに配置しました。以下を使用して実行可能ファイルを実行します。

ld-linux.so.3 --library-path/path/to/libraries実行可能ファイル名

どちらも古いバージョンのAndroid(任意のユーザーとして実行している場合)で動作します。両方とも最新バージョンのAndroid(rootとして実行している場合)で動作します。1つだけがAndroidの最新バージョンは、任意のユーザーとして実行している場合。代わりに、次のようになります。

共有オブジェクトからのセグメントのマップに失敗しました:executable_name操作は許可されていません

実行されない実行可能ファイルと何が違うのかを知るにはどうすればよいですか?

私はオンラインでたくさん読んでいて、このエラーが発生するほとんどの人は次のいずれかです。

A)依存しているライブラリの1つ、または実行可能ファイル自体に対する実行権限がありません。

または

B)NOEXECとしてマウントされているディレクトリから実行しようとしています。

これらの両方が当てはまるようには見えません。それはすべてのライブラリを見つけることができ、私はそれ自体で任意のライブラリをロードし、それが解決されることに依存している他のものを見ることができます。また、関心のあるディレクトリから基本的なスクリプトを実行できます。

Androidの新しいバージョンであるJellyBeanは、異なるLinuxカーネルバージョンであり、それが関連しているのではないかと思います。

何が与えますか?デバッグするにはどうすればよいですか?

15
corbin

問題は、実行可能ファイルのコンパイル方法にありました。新しいアームデバイスを適切にサポートするクロスコンパイラでコンパイルする必要がありました。私が使用したコンパイラは、armデバイスのサブセットでのみ機能する生成された実行可能ファイルを使用しました。この問題は、Androidのさまざまなバージョンでは発生しませんでした。

2
corbin

許可の問題。/tmpを再マウントする必要があります。次のコマンドは私のために働きます(Centos7):

Sudoマウント/ tmp -o remount、exec

10
Denys

別のコンテキストでこのエラーが発生しました。 / tmpフォルダーを使用しようとすると、何らかの理由でエラーが発生します。

これを解決するために私は簡単に:

mkdir tmp
export TMPDIR=`pwd`/tmp
10
vinyll

SELinuxはデフォルトでAndroid 4.3で有効になっていますが、「許容」[0]であると想定されています。電話ベンダーがより制限的なルールを追加した可能性があります。

[0] https://source.Android.com/devices/tech/security/se-linux.html

0
user2698781