dlsym サブルーチン

目的

dlopenでロードされたモジュール内のシンボルの位置を検索します。

構文

#include <dlfcn.h>
void *dlsym(Handle, Symbol);
void *Handle;
const char *Symbol;

説明

dlsym サブルーチンは、 dlopen サブルーチンへの直前の呼び出しによってロードされたモジュールからエクスポートされた、名前付きシンボルを検索します。 エクスポートされたシンボルのみが dlsymによって検出されます。 モジュールからシンボルをエクスポートする方法については、 ld コマンドを参照してください。
項目 説明
処理 前の dlopen 呼び出し、または特殊ハンドル RTLD_DEFAULTRTLD_NEXT 、または RTLD_MYSELFのいずれかによって戻された値を指定します。
シンボル 参照されたモジュールからエクスポートされたシンボルの名前を、以下の形式で指定します。NULL-terminated ストリングまたは特殊シンボル名 RTLD_ENTRY
注: C++ シンボル名は、マングルされた形式で dlsym に渡す必要があります。 dlsym は、呼び出し側アプリケーションの代わりに名前デマングリングを実行しません。

特殊ハンドル RTLD_DEFAULTの場合、 dlsym は、ロードされた最初のモジュールから始まる名前付きシンボルを検索します。 次に、一致するものが見つかるまで、初期ロード・モジュールおよび dlopen を使用して取得されたグローバル・モジュールのリストを処理します。 この探索は、プロセス内のすべてのモジュールを再配置するために採用されたデフォルト・モデルに従います。

特殊ハンドル RTLD_NEXTの場合、 dlsym は、 dlsym 呼び出しが行われるモジュールの後にロードされたモジュール内で、指定されたシンボルを検索します。

特殊ハンドル RTLD_MYSELFの場合、 dlsym は、 dlsym 呼び出しが行われているモジュールからロードされたモジュール内で、指定されたシンボルを検索します。

特殊シンボル名 RTLD_ENTRYの場合、 dlsym はモジュールのエントリー・ポイントを戻します。 エントリー・ポイント (存在する場合) は、エントリー・ポイントとしてマークされたモジュールのローダー・セクション・シンボルの値です。

RTLD_DEFAULTRTLD_NEXT、および RTLD_MYSELFの場合、検索対象のモジュールが dlopen 呼び出しからロードされていると、 dlsym は、呼び出し元が同じ dlopen 依存関係階層の一部であるか、またはモジュールにグローバル検索アクセス権限が与えられている場合に限り、モジュールを検索します。 RTLD_GLOBAL モードの説明については、 dlopen を参照してください。

指定されたシンボルの検索は、モジュールとその従属モジュールの幅優先順序に基づいて行われます。 モジュールが -G または -brtl リンカー・オプションを使用して構成された場合、モジュールの従属モジュールには、 ld コマンド行で指定されたすべてのモジュールが元の順序で組み込まれます。 -G または -brtl リンカー・オプションでリンクされていないモジュールの従属は、指定されていない順序でリストされます。

戻り値

指定されたシンボルが検出されると、そのアドレスが戻されます。 指定されたシンボルが見つからない場合は、次のようになります。NULLが戻され、 errno が 0 に設定されます。 Handle または Symbol が無効な場合は、NULLが戻され、 errnoEINVAL に設定されます。

最初に検出された定義がインポートされたシンボルのエクスポートである場合、この定義は検索を満たします。 インポートされたシンボルのアドレスが戻されます。 最初の定義が据え置きインポートの場合、定義は無視され、検索が続行されます。

指定されたシンボルが、BSSシンボル (初期化されていないデータ構造) の場合、シンボルの初期化されたインスタンスが見つかるか、モジュールとそのすべての従属が検索されるまで、検索が続行されます。 初期化されたインスタンスが見つかった場合は、そのアドレスが返されます。それ以外の場合は、初期化されていない最初のインスタンスのアドレスが返されます。

エラー・コード

項目 説明
EINVAL Handle パラメーターが、まだロードされている dlopen によってオープンされたモジュールを参照していない場合、または Symbol パラメーターが無効なアドレスを指している場合は、 dlsym サブルーチンが戻ります。NULLerrnoEINVALに設定されます。