2010-12-08 7 views
6

を生成可能変数を/home/dumindara/random/sotest/a.outに変更します。LD_PRELOADのための私のlibを設定すると、いくつかのプロセスが私は私だけの実行アクセス権を持っているスクリプトを実行しようとすると、私は次のエラーを取得するローダエラー

a.outは、関数mallocを持ち、dlsymを内部的に呼び出します。

lsを実行してもこの問題は発生しません。ほとんどのプロセスでこのエラーが発生します。なぜこれが起こり、私はそれを機能させるために何ができるのですか?

+0

それは一般的に良いことですシェル環境を変更するのではなく、a.outに対してのみLD_PRELOADを設定するというアイディアです。ほとんどのUNIXシェルでは、 'LD_PRELOAD = xyz。/ a.out'とタイプすることができます。それ以外の場合は '(LD_PRELOAD = xyz; ./a.out)'を試してください。 –

+0

@トニー:私はa.outは、この場合、共有されたオブジェクトだと思います。 OPは明らかに 'malloc()'を独自のバージョンでオーバーライドしてから実際のmallocにパススルーしようとしています。 – thkala

+0

@tkhala:ああ、良いキャッチは、LD_PRELOAD = \ 'pwd \' /a.out program_to_test'のようになります.... –

答えて

13

私は

dlsym()は通常、共有libdl.so.2に常駐libdlライブラリから関数です...あなたのa.outファイルが共有オブジェクトではなく、実行可能であると仮定し、上に移動最新のLinuxシステム上のオブジェクト

あなたのa.out共有オブジェクトがlibdlにリンクされていないと思います。つまり、unameのような単純なバイナリにプリロードすると、他の多くのライブラリを引っ張らないので、libdl.so.2が引き込まれず、定義されていないシンボルエラーが発生する可能性があります。

一方、libdl.so.2にリンクされ、最後にlibdl.so.2を取得するバイナリにプリロードすると、共有オブジェクトは正常に動作します。

あなた自身の共有オブジェクトがlibdlにリンクされている場合はlddにチェックします。unamelsを実行すると、直接的または間接的に引き出されるライブラリもあります。

編集:

これを確認しました。このエラーを修正する方法は、共有オブジェクトをlibdlにリンクすることです。そのLDFLAGSに-ldlを加えることは、そのトリックを行うべきです。

+0

-ldlは他の.oファイルの前にある必要がありますが、例えば"gcc -ldl -shared foo.o bar.o -o baz.so"。 –

16

私は受け入れられた答えにコメントすることはできませんが、コンパイルコマンドの前に-ldlを使用すると、libdl.so.2が正しくリンクされていないという問題が発生することがあります。コンパイルは同じコマンドで実行されます; LD_PRELOADライブラリは通常、1つのソースファイルに基づいているため可能です)。

だから、最後に-ldlとGCCを呼び出します。私の場合は

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

を、前面に-ldlを有する同じ質問のようなエラーが発生しました:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

+0

非常に重要なポイント.. – user1173339

+0

はいいいえ! thkalaの答えはまだ私にエラーを与えたが、最後にあなたの "-ldl"はすべてを解決した。 –

+0

ありがとう!これは私のために働いた! –

関連する問題