GNU/Linux >> Linux の 問題 >  >> Linux

動的にロードされたときのライブラリパス?

動的リンカーは、実際には複数の場所を検索して、各動的ライブラリを見つけます。これらには以下が含まれます (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 でも同じセマンティクスで動作します。


Linux
  1. Mvを呼び出すときにディレクトリパスを含める簡単な方法??

  2. 動的にロードされたときのライブラリパス?

  3. 静的ライブラリを動的にロードしますか?

  1. コンテンツが縮小するときに GTK+ のウィンドウを動的に縮小しますか?

  2. Linux で .so ファイルを java.library.path に追加する方法

  3. .so.2 ファイルとは何ですか?

  1. .so ファイルとは何ですか?

  2. bashで実行可能スクリプトを実行するときにドットスラッシュを回避する方法はありますか?

  3. cd 使用時の / の使用