DLADDR(3)

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

ライブラリ
libc

書式
#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 の伝統に反することです。