2009-10-05 9 views
6

ELFに必要な.soが実行されていないことを知る簡単で効率的な方法がありますか? C/C++プログラム?linux/gcc:ldd C/C++プログラムの機能

ELFを実行しないで、システムの(met/unmet)依存関係を調べることなく、lddと多少類似した機能を持つプログラムが必要です。おそらくライブラリを介してld-linux.soユーティリティに問い合わせるのでしょうか? (私は=のlinuxのこの部分では初心者です)

注:lddのソースコードを読んで、私の意図のための非常に有用ではなかった:lddが、実際には別のプロセスをフォークし、プログラムを実行しているようです。それはプログラムがそれを実行せず、満たされていない依存関係を持っていることを知ることができない場合は

、少なくとも、すぐにすべての私のプログラム内からの.soのようELFために必要を一覧表示する方法はありますか?事前に

おかげで=)

+0

lddユーティリティを起動してその出力を解析するだけではない理由がありますか? Linuxでは、このような手法が広く使われています。 – Juraj

+0

私は自分のプログラム以外のものを実行するためにシェルを呼び出さないことを好むでしょう。さらに、フォークしたり、シェルを起動したりするのは非常に効率的ではありません。実行ファイルが試行錯誤で実行される場合は試してください。 、私はlddを呼び出すことは良い標準選択であると思われる。 – conejoroy

+1

申し訳ありませんが、これは神話です。フォークは今日では高価ではありません。ほとんどのexec *()コールは、シェルを使ってバイナリを実行しません。今後のすべての呼び出しでfork()/ exec()オーバーヘッドと比較して、ld-linux内部をダイビングすることで、より多くの時間を奪うことは簡単に可能です。 – Juraj

答えて

8

handle_dynamic機能を見てみましょう(代わりに通常はバイナリまたはライブラリを実行します)。

setenv("LD_TRACE_LOADED_OBJECTS", "1", 1); 
FILE *ldd = popen("/lib/libz.so"); 
+0

はい、それはちょうどldd(まあ、おそらくenvsの余分なカップルを設定して)と同じ出力を与えるlddはあなたのコード以外の何ものでもありません。もちろん、このソリューションはコードを呼び出すlddを呼び出すのと同じです。別の解決方法を探していました。おそらくld-linux.soを別の直接的な方法で照会していました.. – conejoroy

+0

..シェルを起動しないで) – conejoroy

+0

シェルを起動しないと、簡単に 'fork'と' exec'( 'pipe'が最初に出力したい場合は' fdopen'、 'FILE * ')の代わりに' 'popen''を使います。これは基本的に* which * 'ld-linux.so'をハードコードすることなく' ld-linux.so'に問い合わせています。 – ephemient

1

あなたがdlopen機能を試してみましたか?これを使用してダイナミックライブラリをロードすることができます(または、ライブラリをロードできる場合は、ckeckを使用することもできます)。必要なライブラリのリストを持つ

より困難である、ldd様な結果が得られます非空の文字列に環境変数LD_TRACE_LOADED_OBJECTSを設定し、ld.so(8)あたりとしてreadelf source

+0

その機能は面白いです、私はrpathと別のパラメータを見ることができます..私はさらに調査するでしょう – conejoroy

関連する問題