EN JA
DLINFO(3)
DLINFO(3) FreeBSD Library Functions Manual DLINFO(3)

名称

dlinfoダイナミックにロードしたオブジェクトに関する情報

ライブラリ

Standard C Library (libc, -lc)

書式

#include < link.h>
#include < dlfcn.h>

int
dlinfo( void * restrict handle, int request, void * restrict p);

解説

dlinfo() 関数は、ダイナミックにロードしたオブジェクトに関する情報を提供します。 dlinfo() および正確な意味によってとられる動作、および p 引数のタイプは、呼び出し側によって提供される request 引数の値に依存します。

handle (ハンドル) 引数は dlopen(3) 関数呼び出しから返された値あるいは特別のハンドル RTLD_SELF のいずれかです。 handle (ハンドル) が dlopen(3) 呼び出しから返される値である場合、 dlinfo() 関数によって返された情報は指定されたオブジェクトに関係します。ハンドルが特別のハンドル RTLD_SELF である場合、返された情報は呼び出し側自体に関係します。

request 引数に対するあり得る値は次のとおりです。

RTLD_DI_LINKMAP
指定された handle (ハンドル) のための Link_map ( struct link_map) 構造体ポインタを検索します。成功したリターンにおいては、 p 引数は、 handle (ハンドル) 引数によって指定された、共有オブジェクトについて記述する、 Link_map 構造体 ( Link_map **p) へのポインタで満たされます。 Link_map 構造体は、 dlopen(3)dlclose(3) が呼ばれる、同じ順序で ld.so(1) によってダブルリンクしたリストとして維持されます。 使用例 の例 1 を参照してください

Link_map 構造体は < link.h> で定義され、次のメンバがあります:

caddr_t         l_addr;    /* ライブラリのベースアドレス */ 
const char      *l_name;   /* ライブラリへの絶対パス */ 
const void      *l_ld;     /* メモリ中の .dynamic へのポインタ */ 
struct link_map *l_next,   /* マップライブラリのリンクリスト */ 
                *l_prev;
l_addr
オブジェクトのベースアドレスはメモリへロードしました。
l_name
ロードした共有オブジェクトのフルネーム。
l_ld
メモリにロードされた動的リンク情報セグメント ( PT_DYNAMIC) のアドレス。
l_next
リンクマップリストでの次の Link_map 構造体。
l_prev
リンクマップリストでの前の Link_map 構造体。
RTLD_DI_SERINFO
与えられた handle (ハンドル) 引数に関連したライブラリ検索パスを検索します。 p 引数は Dl_serinfo 構造体バッファ ( Dl_serinfo *p) を指すべきです。 Dl_serinfo 構造体は RTLD_DI_SERINFOSIZE リクエストで最初に初期化しなければなりません。

返された Dl_serinfo 構造体は dls_cnt Dl_serpath エントリを含んでいます。各エントリの dlp_name フィールドは検索パスを指します。対応する dlp_info フィールドは、パスの出所を示す、より多くのフラグのうちの 1 つを含んでいます ( < link.h> ヘッダファイルに定義された LA_SER_* フラグを参照)。使用法の例については、 使用例 の例 2 を参照してください。

RTLD_DI_SERINFOSIZE
RTLD_DI_SERINFO リクエストで使用される Dl_serinfo 構造体を初期化します。 dls_cntdls_size の両方のフィールドはハンドルに適用可能な検索パスの数、および dls_cnt Dl_serpath エントリを保持するのに要求される Dl_serinfo バッファのサイズの合計および関連する検索パス文字列を示すために返されます。使用法の例については、 使用例 の例 2 を参照してください。
RTLD_DI_ORIGIN
ハンドルに関連した動的なオブジェクトの出所を検索します。成功したリターンでは p 引数は char ポインタ ( char *p) で満たされます。

戻り値

dlinfo() 関数は成功すれば 0 を返します。エラーが生じた場合、-1 を返します。エラーが検知された場合は常に、それを詳述するメッセージは dlerror(3) への呼び出しによって検索できます。

使用例

例 1: Link_map 構造体を検索するために dlinfo() を使用します。

次の例は、動的なライブラリが呼び出し側の一つの後にロードした共有ライブラリのリストをどのように検知することができるかを示します。単純にするために、エラーチェックは省略されています。

Link_map *map; 
 
dlinfo(RTLD_SELF, RTLD_DI_LINKMAP, &map); 
 
while (map != NULL) { 
 printf("%p: %s\n", map->l_addr, map->l_name); 
 map = map->l_next; 
}

例 2: ライブラリ検索パスを検索するために dlinfo() を使用します。

次の例は、動的なオブジェクトが dlopen(3) で単純なファイル名を位置付けるために使用されるライブラリ検索パスをどのように検査することができるか示します。単純にするために、エラーチェックは省略されています。

Dl_serinfo  _info, *info = &_info; 
Dl_serpath *path; 
unsigned int  cnt; 
 
/* determine search path count and required buffer size */ 
dlinfo(RTLD_SELF, RTLD_DI_SERINFOSIZE, (void *)info); 
 
/* allocate new buffer and initialize */ 
info = malloc(_info.dls_size); 
info->dls_size = _info.dls_size; 
info->dls_cnt = _info.dls_cnt; 
 
/* obtain sarch path information */ 
dlinfo(RTLD_SELF, RTLD_DI_SERINFO, (void *)info); 
 
path = &info->dls_serpath[0]; 
 
for (cnt = 1; cnt <= info->dls_cnt; cnt++, path++) { 
 (void) printf("%2d: %s\n", cnt, path->dls_name); 
}

歴史

dlinfo() 関数は、Solaris オペレーティングシステムではじめて登場しました。 FreeBSD では FreeBSD 4.8 ではじめて登場しました。

作者

dlinfo() 関数の FreeBSD 実装は、 Alexey Zelkin <phantom@FreeBSD.org>によって最初に書かれ、後に Alexander Kabaev <kan@FreeBSD.org>によって拡張され改善されました。

この関数のためのマニュアルページは、 Alexey Zelkin <phantom@FreeBSD.org>によって書かれました。

February 14, 2003 FreeBSD