1

RTLD_LAZY を渡す dlopen() を使用して .so ファイルを動的にロードする ANSI C プログラムがあります。私は受け取ります

Undefined symbol "_nss_cache_cycle_prevention_function"

FreeBSD 7.2 で .so ファイルがアクセスされるたびに警告が表示されます。nss_cache_cycle_prevention_function() は私のプログラムの関数の 1 つではなく、FreeBSD から来ているに違いないと思います。これは Linux でも問題になる可能性がありますが、Linux では問題が発生していません。FreeBSD 固有のヘッダー ファイルを自分のプログラムにロードしたくありません。この関数を移植可能な方法で含めるか、これらの警告を抑制したいと思います。

4

1 に答える 1

3

「警告を受けました」とはどういう意味ですか? あなたのプログラムは によって返された値を調べて、dlerror()それが NULL でない場合に出力しますか?

は、ネーム サービス キャッシング デーモンであるのサービスを使用するかどうかを決定するために、FreeBSD で_nss_cache_cycle_prevention_functionによって使用されるマーカー シンボルです。実行可能ファイルまたは共有ライブラリに存在しないことは完全に正常です。nsdispatch(3)nscd(8)

ただし、nsdispatch(3)を実行dlsym(3)してシンボルが見つからない場合、エラーが設定されます。Andは、最後の呼び出しのエラーの説明ではなく、最後のエラーdlerror(3)の説明を返します。それがあなたが打っているものだと思います。

解決策(非常に移植可能)は次のとおりです。

  • fordlopen(3)の場合は、使用する前に戻り値をチェックしてdlerror()、エラーが発生したかどうかを確認します。
  • fordlsym(3)NULL有効な戻り値であるため、 への呼び出しのdlerror()にvoid コンテキストで呼び出します。これにより、以前のエラーがクリアされるため、後で への 2 番目の呼び出しが返されたものは何でも信頼できます。dlsym(3)dlerror(3)

dlerror()一般に、他の dl* 呼び出しの前にempty を呼び出しても害はありません。

于 2010-08-30T22:18:56.997 に答える