2016-07-26 6 views
1

libc.soの別のバージョンを科学的目的で使用するには、ELFバイナリファイルを作成する必要があります。私はLD_PRELOADpatchelfユーティリティでそれを実行しようとしましたが、その後、バイナリのようなエラーで実行できません:別のlibc.soを使用するようにELFバイナリを強制する

./a.out: error while loading shared libraries: libc-2.15.so: cannot open shared object file: No such file or directoryまたはSegmentation fault (core dumped)

ld.soという別のバージョンが必要なためだと思います。

私のバイナリバージョンをlibcで使用する最も効率的な方法は何ですか?

EDIT:私はバイナリのソースコードを持っていません。

EDIT:エラーメッセージが編集されました。 SELinuxなし、AppArmorなし

+0

libcは通常動的にリンクされているので、OSのlibcを使いたいものに置き換えることはすべきことです。 – m0skit0

+1

@ m0skit0:あなたのシステム全体のlibcを本当に置き換えるならば、新しいものがあなたのシステム上のいくつかのプログラムを壊したならば、これがあなたのシステムでやった最後のことだと思うかもしれません...幸運:-) – Klaus

+1

'LD_LIBRARY_PATH'環境変数を設定しようとしていますか?バイナリのソースコードを再コンパイルできますか?あなたの質問を編集して改善することを検討してください。 –

答えて

2

私にとって、あなたは新しいlibcの変種への道全体を費やさなかったようです。私は次のようでした

ldd example 

linux-vdso.so.1 (0x00007ffe9c087000) 
libstdc++.so.6 => /opt/linux-gnu_6.1.0/lib64/libstdc++.so.6 (0x00007f0cef872000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f0cef56f000) 
libgcc_s.so.1 => /opt/linux-gnu_6.1.0/lib64/libgcc_s.so.1 (0x00007f0cef359000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f0ceef98000) 
/lib64/ld-linux-x86-64.so.2 (0x000055ca3cb92000) 

LD_PRELOAD=/tmp/bug_libc.so ldd example 

linux-vdso.so.1 (0x00007ffc2cff8000) 
/tmp/bug_libc.so (0x00007f56a1358000) 
libstdc++.so.6 => /opt/linux-gnu_6.1.0/lib64/libstdc++.so.6 (0x00007f56a0f9a000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f56a0c98000) 
libgcc_s.so.1 => /opt/linux-gnu_6.1.0/lib64/libgcc_s.so.1 (0x00007f56a0a82000) 
/lib64/ld-linux-x86-64.so.2 (0x00005605c8a7a000) 

私は非有効libcのAと交換した場合は、別のエラーメッセージが表示されました。

LD_PRELOAD=/tmp/bug_libc.so2 ldd go 

ERROR: ld.so: object '/tmp/bug_libc.so2' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. 
ERROR: ld.so: object '/tmp/bug_libc.so2' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. 
linux-vdso.so.1 (0x00007ffedcde4000) 
libstdc++.so.6 => /opt/linux-gnu_6.1.0/lib64/libstdc++.so.6 (0x00007f3ae2188000) 
libm.so.6 => /lib64/libm.so.6 (0x00007f3ae1e85000) 
libgcc_s.so.1 => /opt/linux-gnu_6.1.0/lib64/libgcc_s.so.1 (0x00007f3ae1c6f000) 
libc.so.6 => /lib64/libc.so.6 (0x00007f3ae18ae000) 
/lib64/ld-linux-x86-64.so.2 (0x000055df54aae000) 

代替libcファイルにアクセスすると、別の問題が発生する場合があります。 ファイルのアクセスフラグをチェックし、SELinuxまたはAppArmorまたは他の保護があなたの環境でlibcのロードを停止しているかどうかも確認してください。 libcの置き換えはセキュリティホールを開くので、SELinuxの候補は& Co!

そして常にlddで確認してください。おそらくあなたの新しいlibcには、あなたのシステム上で見つからない他のlibsのいくつかの(古い)バリエーションが必要かもしれません。 Normaly libcは他のlibsを必要としませんでしたが、あなたはどのゲームをプレイしているのか分かりません。何でも:lddは、ライブラリのロード段階で起こっていることに、より詳細な答えを与えます。

EDIT:セグメンテーション違反

あなたがセグメンテーションフォルトを取得する場合は、あなたは一般的に互換性のないヘッダファイルを使用してアプリケーションをコンパイルしています。使用するlibcバージョンに付属のヘッダでコンパイルする必要があります。システムlibcのシステムヘッダに対してコンパイルし、互換性のないバージョンのプリコンパイル済みlibcを実行すると、間違ったデータ構造にアクセスすることによってあらゆる種類のメモリエラーが発生します。

+0

"segfaultを入手した場合、通常、互換性のないヘッダーファイルを使用してアプリケーションをコンパイルしています。 - あなたは間違っています。デフォルトでない 'libc.so.6'を使うときのsegfaultの最も一般的な原因は、' ld-linux.so'との間の不一致です。 http://stackoverflow.com/a/851229/50617 –

1

This answerが理由を説明する理由LD_PRELOADは、できませんと解決策を提案します。

私はLD_PRELOADとpatchelfユーティリティ

でそれを実行しようとしましたそれはpatchelfのご利用のみDT_RPATH、唯一PT_INTERP、またはその両方に触れたかどうかは明らかではありません。あなたは両方をする必要があります。

関連する問題