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

名称

dladdr与えられたアドレスを含んでいる共有オブジェクトを見つける

ライブラリ

Standard C Library (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 の伝統に反します。
February 5, 1998 FreeBSD