14

実行アクセス権しかないスクリプトを実行しようとすると、次のエラーが発生します。

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

これは、LD_PRELOAD環境変数を に設定した後/home/dumindara/random/sotest/a.outです。

a.outテスト機能を持ち、内部的mallocに呼び出します。dlsym

実行中はこの問題は発生しませんls。ほとんどのプロセスでこのエラーが発生します。なぜこれが起こるのですか?それを機能させるにはどうすればよいですか?

4

2 に答える 2

33

-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

于 2012-10-24T09:08:37.350 に答える
15

あなたの a.out ファイルは実行可能ファイルではなく共有オブジェクトであると仮定して、先に進みます...

dlsym()libdl ライブラリの関数で、通常、最新の Linux システムの libdl.so.2 共有オブジェクトにあります。

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

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

ldd独自の共有オブジェクトが必要に応じて libdl に対してリンクされているかどうか、unameおよび実行時に直接または間接的にどのライブラリが取り込まれているかを確認しlsます。

編集:

これだけ確認しました。このエラーを修正する方法は、共有オブジェクトを libdl にリンクすることです。-ldlその LDFLAGS に追加するとうまくいくはずです。

于 2010-12-08T07:51:44.153 に答える