4

未解決のシンボル参照が発生したときにトラップして、必要に応じてシンボルを解決しようとする関数が呼び出されるようにすることは可能ですか? または、ライブラリ ファイルを作成して dlopen することなく、実行時に動的シンボル テーブルに新しいシンボルを追加することは可能ですか? GCC を使用して、GNU/Linux を使用しています。(他の Unix への移植性は良いことですが、重要な問題ではありません。)

前もって感謝します!

編集:私がやろうとしていることについてもっと詳しく説明する必要がありました。コンパイルされた (dlopen された) モジュールと解釈されたモジュールの両方をサポートすることが期待される、プログラミング言語用のインタープリターを作成したいと考えています。コンパイルされたモジュールから別の場所で定義された関数への呼び出しをリンカで解決して、呼び出しごとに関数のルックアップを回避したかったのですが、解釈されたコードへの呼び出しは未解決のままでした。これらの呼び出しをトラップして、必要に応じて適切な解釈された関数を呼び出すことができるようにしたいと考えました (または、関数が存在しない場合はエラーを通知します)。

4

2 に答える 2

2

私は、あなたが対処しようとしている問題は、あなたがdlopenロード可能なモジュールを使い始め、その後、未解決のシンボルが原因で突然クラッシュする場合であると大げさに推測しています。その場合、これは遅延バインディングの結果であり、環境にエクスポートLD_BIND_NOW=1(または設定されている限り任意の値)することで無効にできます。これにより、戻る前にすべてのシンボルを解決できるようになります。解決dlopenできない場合は、dlopen操作が失敗し、状況を適切に処理できるようになります。

于 2011-08-19T03:29:07.220 に答える
2

不足しているシンボルがわかっている場合は、それらだけでライブラリを作成し、アプリケーションの実行前に LD_PRELOAD を実行できます。

不足しているシンボルのリストがない場合は、バイナリで「nm」または「objdump」を使用してそれらを発見し、それに基づいて、ライブラリをビルドするスクリプトを記述します。アプリケーションの実行前に不足しているシンボルを削除し、LD_PRELOAD も同様に実行します。

また、gdb を使用して新しい「コード」をアプリケーションに挿入し、関数が必要なものを指すようにすることもできます。

最後に、いくつかの ld.so 関数をオーバーライドして、欠落しているシンボルを検出し、それらに対して何かを行うこともできます。

いずれにせよ、何を達成しようとしているのかを説明できれば、適切な解決策を提供しやすくなります。

于 2011-08-19T03:10:08.367 に答える