2016-10-11 16 views
5

スクリプトを実行するときにLD_PRELOADを使用してライブラリを事前にロードすると、実際にはスクリプトにシボンの行がある場合にのみライブラリがプリロードされます。たとえば、このスクリプトを与えられた:なぜシェパンのないスクリプトでLD_PRELOADが有効にならないのですか?

# Not a shebang 
echo Hello 

と、このコマンド:

LD_PRELOAD=/path/to/preload_me.so ./script.sh 

スクリプトは、私はその初期の(非)効果を経由して監視することができ、すべてのロードされているライブラリ、なしで実行コード。

一方、私はシェバング行追加した場合:

#!/bin/sh 
echo Hello 

を...そしてライブラリは、私が同じコマンドを経由してスクリプトを実行したときにロードされです。正確にどの通訳が指定されているかは重要ではないようです。確かに私は/bin/bashまたは私が試した他のsh - ファミリーシェルを使用することもできます。

なぜ違いがあり、コマンドに関係なく、指定されたシェルの単純なコマンドの前に特定のライブラリがプリロードされていることを確認する方法はありますか?

(その作者これらの用語で表現された質問に抵抗しanother questionから適応。)

答えて

6

(参照他の質問に私の答えから適応。)

LD_PRELOAD変数がノーを持っていることを理解することが不可欠ですオペレーティングシステムまたはシェルにとって特別な意味を持ちます。ダイナミックリンカーとの組み合わせでのみ意味と効果があります。動的リンカーが使用されていない場合、LD_PRELOADは環境内の別の変数に過ぎません。同様に、ダイナミックリンカがその変数を認識しない場合(たとえば、OS Xの場合)

実行可能形式ではないがシバン行を含むファイルに対応する名前のコマンドを実行するときは、シェル自体であっても指定されたインタープリタが実行されることも理解する必要があります。インタプリタがELFバイナリの場合、動的リンカが使用されます。一方、シバンラインがない場合、bashは、ダイナミックリンカを必要としないサブシェル環境でファイルの内容を実行します。代わりに、シェルはちょうどフォークします。他のシェルは、同じことをしてもしなくてもよい。

ELF以外の実行形式が存在することを認識することも重要です。現代のELFベースのシステムでは、このようなバイナリを実行する可能性は低いですが、可能性を排除すべきではありません。

最終行:ユーザーが選択したbashまたは別のシェルを使用して実行される任意のシェルコマンドのプロセス領域に、特定の動的ライブラリを事前にロードする方法はありません。このようなライブラリを任意のコマンドに対してプリロードする必要がある場合は、おそらくカスタムシェルとカスタムダイナミックリンカーを用意し、他のものが使用されないように、実行環境をもっと厳密に制御する必要があります。

+2

これは良い答えですが、私はあなたが 'bash'(とおそらく他のシェル)に当てはまることを明確にすべきだと思います。' dash'はこれをやっていないようです。 (スクリプトを実行しますが、プリロードが有効になります。)すべてのPosixは、 "シェルは最初のオペランドとして検索結果のパス名でシェルを起動させるのと同等のコマンドを実行する"としています。どちらの動作にも適用できます。 (私のシステムでのクイックテスト:zshプリロード、kshはありません。) – rici

+0

@rici、答えは、明示的には 'bash' *が新しいシェルプロセスをexecするのではなくforkしますが、明確化。 –

関連する問題