動的リンカーは、実際には複数の場所を検索して、各動的ライブラリを見つけます。これらには以下が含まれます (man ld.so から):
- 環境変数
LD_LIBRARY_PATH
によって指定されたパス - バイナリに組み込まれたパスは、
DT_RUNPATH
でライブラリをロードします エントリー - キャッシュ ファイル /etc/ld.so.cache
- /lib と /usr/lib
特定の共有ライブラリのパスを取得したい場合は、 dladdr
をお勧めします 関数。マニュアルページから:
関数 dladdr() は、関数ポインターを取り、それが配置されている名前とファイルを解決しようとします。情報はDl_info
に保存されます 構造:
typedef struct {
const char *dli_fname; /* Pathname of shared object that
contains address */
void *dli_fbase; /* Address at which shared object
is loaded */
const char *dli_sname; /* Name of nearest symbol with address
lower than addr */
void *dli_saddr; /* Exact address of symbol named
in dli_sname */
} Dl_info;
addr に一致するシンボルが見つからない場合、dli_sname
そしてdli_saddr
NULL
に設定されています .
dladdr()
エラーの場合は 0 を返し、成功の場合は 0 以外を返します。
したがって、関数ポインタを与えるだけで、それを提供するファイルの名前とその他の情報が得られます。したがって、たとえば、ライブラリ内のコンストラクターでこれを呼び出して、ライブラリーのフルパスを見つけることができます:
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
__attribute__((constructor))
void on_load(void) {
Dl_info dl_info;
dladdr((void *)on_load, &dl_info);
fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}
この関数は、OS X でも同じセマンティクスで動作します。