スポンサーリンク

DLADDR(3) FreeBSD ライブラリ関数マニュアル DLADDR(3)

名称

dladdr − 指定のアドレスが含まれる共有オブジェクトを検出する

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <dlfcn.h>

int

dladdr(const void *addr, Dl_info *info);

解説

dladdr は、アドレス addr が含まれる共有オブジェクトに関する情報について動 的リンカを照会します。情報は、 info によって指定される構造体内に返されま す。この構造体には少なくとも次のメンバが含まれます。

       const char *dli_fname

指定したアドレスが含まれる共有オブジェクトのパ ス名。

void *dli_fbase
共有オブジェクトが呼び出し元プロセスのアドレス 空間にマップされるベースアドレス。

const char *dli_sname
addr
以下の値を持った最も近いランタイムシンボル の名前。可能なときは、シンボル名が C ソースコー ドで表示されるように返されます。

適切な値のシンボルが見つからない場合は、この フィールドと dli_saddr の両方が NULL に設定され ます。

void *dli_saddr
dli_sname で返されたシンボルの値。

dladdr は動的にリンクされるプログラムでだけ利用できます。

エラー

addr が含まれているマップされた共有オブジェクトが見つからない場合、 dladdr は 0 を返します。この場合、失敗理由を詳しく述べたメッセージを dlerror() を呼び出すことで取り出すことができます。

成功時には、0 でない値が返されます。

関連項目

rtld(1), dlopen(3)

歴史

dladdr 関数は Solaris オペレーティングシステムではじめて登場しました。

バグ

この関数は、Solaris での実装とバグに互換性があります。特に、次のバグが存 在します。

 addr が共有ライブラリではなくメインの実行可能モジュールにある場合、dli_fname で返されるパス名は正しいものにならない可能性があります。パス名は呼び出しプロセスの argv[0] から直接取り出されます。フルパス名で指定されたプログラムを実行するとき、ほとんどのシェルは argv[0] をパス名に設定します。しかし、これはシェルの必要条件ではありませんし、オペレーティングシステムによって保証されてもいません。

addr が形式 &func ( func はグローバル関数) である場合、その値が好まし くない驚くものになってしまう可能性があります。動的リンクされたプログ ラムでは、グローバル関数のアドレスは関数そのもののエントリポイントで はなく、プログラムリンクテーブルのエントリを指すと考えられます。この ため、大部分のグローバル関数が、実際のコードが入っている共有ライブラ リではなく、メインの実行可能モジュール内部で定義されているように見え ます。

処理の失敗を示すものとして 0 を返すのは、長く続いている Unix の伝統に 反することです。

FreeBSD 10.0 February 5, 1998 FreeBSD 10.0

スポンサーリンク